#include <bits/stdc++.h>
const int N = 105;
int ct[N][26], n, ans[N], f[N][26], g[N][26];
char s[N];
void qry(int l, int r) {
  printf("? %d %d\n", l, r);
  fflush(stdout);
  int len = r - l + 1;
  memset(ct, 0, sizeof(ct));
  for (int i = 1; i <= len * (len + 1) / 2; i++) {
    scanf("%s", s);
    int nn = strlen(s);
    for (int j = 0; j < nn; j++) ct[nn][s[j] - 'a']++;
  }
}
void solve(int n) {
  if (n == 1) {
    qry(1, 1);
    for (int j = 0; j < 26; j++)
      if (ct[1][j]) {
        ans[1] = j;
        return;
      }
  }
  qry(1, n);
  memcpy(f, ct, sizeof(f));
  qry(2, n);
  memcpy(g, ct, sizeof(g));
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j < i; j++) f[i][ans[j]]--;
    for (int j = 0; j < 26; j++)
      if (f[i][j] > g[i][j]) {
        ans[i] = j;
        break;
      }
  }
}
int main() {
  scanf("%d", &n);
  if (n == 1) {
    qry(1, 1);
    for (int j = 0; j < 26; j++)
      if (ct[1][j]) {
        printf("! %c\n", j + 'a');
        return 0;
      }
  }
  solve((n + 1) / 2);
  qry(1, n);
  for (int i = n / 2; i >= 1; i--) {
    for (int j = 0; j < 26; j++) {
      int t = ct[i][j] - ct[i - 1][j];
      for (int k = i; k <= n - i; k++) t -= (ans[k] == j);
      if (t > 0) {
        ans[n - i + 1] = j;
      }
    }
  }
  printf("! ");
  for (int i = 1; i <= n; i++) printf("%c", ans[i] + 'a');
  puts("");
}
