#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) {
    if (ch == '-') f = -1;
  }
  for (; isdigit(ch); ch = getchar()) {
    x = x * 10 + ch - 48;
  }
  return x * f;
}
const int N = 101;
const int S = 26;
char str[N + 3];
namespace Subtask {
int a[N + 3][N + 3][S + 3], cnta[N + 3], b[N + 3][N + 3][S + 3], cntb[N + 3];
bool fa[N + 3][N + 3], fb[N + 3][N + 3];
int cur[S + 3];
char ans[N + 3];
void solve(int n, char ans[]) {
  cout << '?' << ' ' << 1 << ' ' << n - 1 << ' ' << endl;
  cout.flush();
  for (int i = 1; i <= (n - 1) * n / 2; i++) {
    cin >> str + 1;
    int len = strlen(str + 1);
    cnta[len]++;
    for (int j = 1; j <= len; j++) a[len][cnta[len]][str[j] - 96]++;
  }
  cout << '?' << ' ' << 1 << ' ' << n << ' ' << endl;
  cout.flush();
  for (int i = 1; i <= n * (n + 1) / 2; i++) {
    cin >> str + 1;
    int len = strlen(str + 1);
    cntb[len]++;
    for (int j = 1; j <= len; j++) b[len][cntb[len]][str[j] - 96]++;
  }
  for (int i = 1; i <= n; i++) {
    int id = 0;
    for (int k = 1; k <= cntb[i]; k++) {
      bool found = false;
      for (int j = 1; j <= cnta[i]; j++) {
        if (fa[i][j]) continue;
        bool same = true;
        for (int s = 1; s <= S; s++) {
          if (a[i][j][s] != b[i][k][s]) {
            same = false;
            break;
          }
        }
        if (same) {
          found = true;
          fa[i][j] = true;
          break;
        }
      }
      if (!found) {
        id = k;
        break;
      }
    }
    for (int s = 1; s <= S; s++) {
      if (b[i][id][s] != cur[s]) {
        cur[s]++;
        ans[n - i + 1] = s + 96;
        break;
      }
    }
  }
}
}  // namespace Subtask
int a[N + 3][N + 3][S + 3], cnta[N + 3];
int tot[N + 3][S + 3];
int dif[N + 3][S + 3];
char ans[N + 3];
int n;
int main() {
  cin >> n;
  if (n == 1) {
    cout << '?' << ' ' << 1 << ' ' << 1 << endl;
    cout.flush();
    cin >> ans;
    cout << '!' << ' ' << ans << endl;
    cout.flush();
    return 0;
  } else if (n == 2) {
    Subtask::solve(2, ans);
    cout << '!' << ' ' << ans + 1 << endl;
    cout.flush();
    return 0;
  }
  int nn = (n + 1) >> 1;
  Subtask::solve(nn, ans);
  cout << '?' << ' ' << 1 << ' ' << n << endl;
  cout.flush();
  for (int i = 1; i <= n * (n + 1) / 2; i++) {
    cin >> str + 1;
    int len = strlen(str + 1);
    cnta[len]++;
    for (int j = 1; j <= len; j++)
      a[len][cnta[len]][j] = str[j] - 96, tot[len][str[j] - 96]++;
  }
  for (int l = nn + 1; l <= n; l++) {
    for (int i = 1; i <= nn; i++) {
      tot[l][ans[i] - 96] -= min(i, n - l + 1);
    }
  }
  for (int l = nn + 1; l <= n; l++) {
    for (int i = 1; i <= S; i++) {
      dif[l][i] = tot[l][i] - tot[l + 1][i];
      if (dif[l][i] != dif[l - 1][i]) {
        ans[l] = i + 96;
      }
    }
  }
  cout << '!' << ' ' << ans + 1 << endl;
  cout.flush();
  return 0;
}
