#include <bits/stdc++.h>
using namespace std;
const int P = 1 << 10;
char pp[P];
struct dt {
  int cnt[26];
  void Prt() {
    for (int i = 0; i < 5; i++) printf("%d ", cnt[i]);
    puts("Hd");
  }
};
bool operator<(dt a, dt b) {
  for (int i = 0; i < 25; i++)
    if (a.cnt[i] != b.cnt[i]) return a.cnt[i] < b.cnt[i];
  return a.cnt[25] < b.cnt[25];
}
map<dt, int> cer;
int cc[P][26];
int ans[P];
int main() {
  int n;
  scanf("%d", &n);
  if (n <= 3) {
    char op[5];
    for (int i = 1; i <= n; i++) {
      printf("? %d %d\n", i, i);
      fflush(stdout);
      for (op[i] = getchar(); op[i] < 'a' || op[i] > 'z'; op[i] = getchar())
        ;
    }
    printf("! ");
    for (int i = 1; i <= n; i++) printf("%c", op[i]);
    puts("");
    return 0;
  }
  int mid = (1 + n) >> 1;
  printf("? 1 %d\n", mid - 1);
  fflush(stdout);
  for (int i = 0; i < mid * (mid - 1) / 2; i++) {
    scanf("%s", pp);
    dt New;
    fill(New.cnt, New.cnt + 26, 0);
    int len = strlen(pp);
    for (int i = 0; i < len; i++) New.cnt[pp[i] - 'a']++;
    cer[New]--;
  }
  printf("? 1 %d\n", mid);
  fflush(stdout);
  for (int i = 0; i < mid * (mid + 1) / 2; i++) {
    scanf("%s", pp);
    dt New;
    fill(New.cnt, New.cnt + 26, 0);
    int len = strlen(pp);
    for (int i = 0; i < len; i++) New.cnt[pp[i] - 'a']++;
    cer[New]++;
    if (cer[New] > 0)
      for (int j = 0; j < len; j++) ans[mid - len + 1] ^= pp[j] - 'a';
  }
  for (int i = 1; i < mid; i++) ans[i] ^= ans[i + 1];
  printf("? 1 %d\n", n);
  fflush(stdout);
  int num = n * (n + 1) / 2;
  cer.clear();
  for (int i = 0; i < num; i++) {
    scanf("%s", pp);
    dt New;
    fill(New.cnt, New.cnt + 26, 0);
    int len = strlen(pp);
    for (int i = 0; i < len; i++)
      New.cnt[pp[i] - 'a']++, cc[len][pp[i] - 'a']++;
    cer[New]++;
  }
  for (int i = mid + 1; i > 1; --i)
    for (int j = 0; j < 26; j++) cc[i][j] -= cc[i - 1][j];
  for (int i = 1; i <= mid; i++) {
    int us = 0;
    for (int j = 0; j < 26; j++)
      if (cc[i][j] == cc[i + 1][j] + 2)
        us = 0;
      else if (cc[i][j] == cc[i + 1][j] + 1)
        us ^= j;
    if (!ans[n - i + 1]) ans[n - i + 1] = us ^ ans[i];
  }
  putchar('!'), putchar(' ');
  for (int i = 1; i <= n; i++) putchar('a' + ans[i]);
  return 0;
}
