#include <bits/stdc++.h>
using namespace std;
int n, m, l, r;
string ch[2010];
int vis[2010][2010], num[2010][2010], cnt[2010][2010];
char ans[2010];
struct arr {
  string ch;
  bool operator<(const arr &t) const {
    if (ch.length() != t.ch.length()) return ch.length() < t.ch.length();
    return ch < t.ch;
  }
};
multiset<arr> haha;
multiset<arr>::iterator pos;
int main() {
  scanf("%d", &n);
  if (n == 1) {
    l = 1;
    r = 1;
    printf("? %d %d\n", l, r);
    fflush(stdout);
    string t;
    cin >> t;
    cout << "! " << t << endl;
    return 0;
  }
  l = 1;
  r = n / 2;
  if (n % 2 != 0) r++;
  printf("? %d %d\n", l, r);
  fflush(stdout);
  m = (r - l + 1 + 1) * (r - l + 1) / 2;
  for (int i = 1; i <= m; i++) {
    string t;
    cin >> t;
    int len = t.length() - 1;
    for (int x = 0; x <= len; x++)
      for (int y = x + 1; y <= len; y++)
        if (t[x] > t[y]) swap(t[x], t[y]);
    arr now;
    now.ch = t;
    haha.insert(now);
  }
  l = 2;
  if (l <= r) {
    printf("? %d %d\n", l, r);
    fflush(stdout);
    m = (r - l + 1 + 1) * (r - l + 1) / 2;
    for (int i = 1; i <= m; i++) {
      string t;
      cin >> t;
      int len = t.length() - 1;
      for (int x = 0; x <= len; x++)
        for (int y = x + 1; y <= len; y++)
          if (t[x] > t[y]) swap(t[x], t[y]);
      arr now;
      now.ch = t;
      pos = haha.find(now);
      if (pos != haha.end()) haha.erase(pos);
    }
  }
  l = 1;
  r = n;
  printf("? %d %d\n", l, r);
  fflush(stdout);
  m = (r - l + 1 + 1) * (r - l + 1) / 2;
  for (int i = 1; i <= m; i++) {
    string t;
    cin >> t;
    int len = t.length();
    for (int j = 0; j < len; j++) cnt[len][t[j] - 'a']++;
  }
  m = 0;
  for (pos = haha.begin(); pos != haha.end(); pos++) ch[++m] = (*pos).ch;
  cout << "! ";
  for (int i = 1; i <= m; i++) {
    char letter;
    for (int j = 0; j < ch[i].length(); j++)
      if (!vis[i][j]) {
        letter = ch[i][j];
        break;
      }
    cout << letter;
    for (int k = i + 1; k <= m; k++)
      for (int j = 0; j < ch[k].length(); j++)
        if (!vis[k][j] && ch[k][j] == letter) {
          vis[k][j] = 1;
          break;
        }
    ans[i] = letter;
  }
  for (int i = 1; i <= m; i++) {
    for (int j = 0; j < 26; j++) num[i][j] = num[i - 1][j];
    num[i][ans[i] - 'a']++;
  }
  for (int i = m + 1; i <= n; i++) {
    int st = n - i;
    for (int j = 0; j < 26; j++) {
      int temp;
      if (cnt[st + 1][j] - cnt[st][j] - (num[i - 1][j] - num[st][j]) == 1) {
        ans[i] = (char)(j + 'a');
        break;
      }
    }
    cout << ans[i];
    for (int j = 0; j < 26; j++) num[i][j] = num[i - 1][j];
    num[i][ans[i] - 'a']++;
  }
  return 0;
}
