#include <bits/stdc++.h>
using namespace std;
int main() {
  int a[100][30];
  int b[100][30];
  int e[100][30];
  int d[110];
  for (int i = 0; i < (int)(100); i++) {
    for (int j = 0; j < (int)(30); j++) {
      a[i][j] = 0;
      b[i][j] = 0;
      e[i][j] = 0;
    }
  }
  char c[200010];
  for (int i = 0; i < (int)(200010); i++) c[i] = 0;
  int n, k, nn;
  int x, y, z, yy, zz;
  int s, ans;
  bool v = true;
  ans = 0;
  scanf("%d", &n);
  if (n <= 3) {
    for (int i = 0; i < (int)(n); i++) {
      printf("? %d %d\n", i + 1, i + 1);
      fflush(stdout);
      scanf("%s", c);
      d[i] = c[0];
      c[0] = 0;
    }
    printf("! ");
    for (int i = 0; i < (int)(n); i++) printf("%c", d[i]);
    printf("\n");
    fflush(stdout);
    return 0;
  }
  nn = n;
  n = (2 * n) / 3;
  printf("? 1 %d\n", n);
  fflush(stdout);
  k = n * (n + 1);
  k = k / 2;
  y = (n + 1) / 2;
  for (int i = 0; i < (int)(k); i++) {
    scanf("%s", c);
    x = strlen(c);
    if (x <= y) {
      for (int j = 0; j < (int)(x); j++) a[x][(c[j] - 'a')]++;
    }
    for (int i = 0; i < (int)(x + 1); i++) c[i] = 0;
  }
  for (int i = y - 2; i >= 0; i--) {
    for (int j = 0; j < (int)(30); j++) a[i + 2][j] -= a[i + 1][j];
  }
  for (int i = 0; i < (int)(y - 1); i++) {
    for (int j = 0; j < (int)(30); j++) a[i + 1][j] -= a[i + 2][j];
  }
  printf("? 1 %d\n", n - 1);
  fflush(stdout);
  k = n * (n - 1);
  k = k / 2;
  y = n / 2;
  for (int i = 0; i < (int)(k); i++) {
    scanf("%s", c);
    x = strlen(c);
    if (x <= y) {
      for (int j = 0; j < (int)(x); j++) b[x][(c[j] - 'a')]++;
    }
    for (int i = 0; i < (int)(x + 1); i++) c[i] = 0;
  }
  for (int i = y - 2; i >= 0; i--) {
    for (int j = 0; j < (int)(30); j++) b[i + 2][j] -= b[i + 1][j];
  }
  for (int i = 0; i < (int)(y - 1); i++) {
    for (int j = 0; j < (int)(30); j++) b[i + 1][j] -= b[i + 2][j];
  }
  if (n % 2 == 0) {
    y = n / 2;
    while (y >= 1) {
      z = y - 1;
      zz = n - y;
      for (int j = 0; j < (int)(30); j++)
        if (b[y][j] > 0) d[z] = j;
      a[y][d[z]]--;
      for (int j = 0; j < (int)(30); j++)
        if (a[y][j] > 0) d[zz] = j;
      y--;
      b[y][d[zz]]--;
    }
  } else {
    y = (n + 1) / 2;
    zz = y - 1;
    for (int j = 0; j < (int)(30); j++)
      if (a[y][j] > 0) d[zz] = j;
    y--;
    b[y][d[zz]]--;
    while (y >= 1) {
      z = y - 1;
      zz = n - y;
      for (int j = 0; j < (int)(30); j++)
        if (b[y][j] > 0) d[z] = j;
      a[y][d[z]]--;
      for (int j = 0; j < (int)(30); j++)
        if (a[y][j] > 0) d[zz] = j;
      y--;
      b[y][d[zz]]--;
    }
  }
  printf("? %d %d\n", (2 * n) + 2 - nn, nn);
  fflush(stdout);
  k = (2 * nn) - (2 * n) - 1;
  y = (k + 1) / 2;
  k = k * (k + 1);
  k = k / 2;
  for (int i = 0; i < (int)(k); i++) {
    scanf("%s", c);
    x = strlen(c);
    if (x <= y) {
      for (int j = 0; j < (int)(x); j++) e[x][(c[j] - 'a')]++;
    }
    for (int i = 0; i < (int)(x + 1); i++) c[i] = 0;
  }
  for (int i = y - 2; i >= 0; i--) {
    for (int j = 0; j < (int)(30); j++) e[i + 2][j] -= e[i + 1][j];
  }
  for (int i = 0; i < (int)(y - 1); i++) {
    for (int j = 0; j < (int)(30); j++) e[i + 1][j] -= e[i + 2][j];
  }
  for (int j = 0; j < (int)(30); j++)
    if (e[y][j] > 0) d[n] = j;
  for (int i = n + 1; i < nn; i++) {
    e[y - (i - n)][d[n - (i - n)]]--;
    for (int j = 0; j < (int)(30); j++)
      if (e[y - (i - n)][j] > 0) d[i] = j;
  }
  printf("! ");
  for (int i = 0; i < (int)(nn); i++) printf("%c", 'a' + d[i]);
  printf("\n");
  fflush(stdout);
  return 0;
}
