#include <bits/stdc++.h>
using namespace std;
void read(int &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -f;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  x *= f;
}
void print(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (!x) return;
  print(x / 10), putchar(x % 10 + 48);
}
void write(int x) {
  if (!x)
    putchar('0');
  else
    print(x);
  putchar('\n');
}
const int maxn = 1e6 + 10;
const int inf = 1e9;
const double eps = 1e-8;
const int mod = 1e9 + 7;
int n, t[maxn], p[maxn];
char c[maxn], s[maxn];
void query(int l, int r) {
  printf("? %d %d\n", l, r);
  fflush(stdout);
}
int main() {
  read(n);
  if (n <= 3) {
    for (int i = 1; i <= n; i++) query(i, i), scanf("%s", c + 1), s[i] = c[1];
    printf("! %s\n", s + 1);
    return 0;
  }
  int m = n / 2;
  query(1, m);
  for (int i = 1; i <= m * (m + 1) / 2; i++) {
    scanf("%s", c + 1);
    int l = strlen(c + 1);
    cerr << l << endl;
    for (int j = 1; j <= l; j++) t[l] += c[j];
  }
  query(2, m);
  for (int i = 1; i <= m * (m - 1) / 2; i++) {
    scanf("%s", c + 1);
    int l = strlen(c + 1);
    cerr << l << endl;
    for (int j = 1; j <= l; j++) t[l] -= c[j];
  }
  for (int i = m; i; i--) t[i] -= t[i - 1], s[i] = t[i];
  query(1, n);
  for (int i = 1; i <= n * (n + 1) / 2; i++) {
    scanf("%s", c + 1);
    int l = strlen(c + 1);
    if (l <= m) continue;
    for (int j = 1; j <= l; j++) p[l] += c[j];
  }
  for (int i = m + 1; i <= n; i++)
    for (int j = 1; j <= m; j++) p[i] -= min(j, n - i + 1) * s[j];
  for (int i = m + 1; i <= n; i++) p[i] -= p[i + 1];
  for (int i = n; i >= m + 1; i--) p[i] -= p[i - 1], s[i] = p[i];
  printf("! %s\n", s + 1);
  return 0;
}
