#include <bits/stdc++.h>
using namespace std;
long long read() {
  long long w = 0, f = 1;
  char c = ' ';
  while (c < '0' || c > '9') c = getchar(), f = c == '-' ? -1 : f;
  while (c >= '0' && c <= '9') w = w * 10 + c - 48, c = getchar();
  return w * f;
}
string s[2][105 * 105 >> 1];
char ch[105], ans[105];
long long sum[105], w[105];
bool cmp1(char x, char y) { return x < y; }
bool cmp2(string x, string y) {
  if (x.size() != y.size()) return x.size() < y.size();
  for (long long i = 0; i < x.size(); i++) {
    if (x[i] < y[i]) return 1;
    if (x[i] > y[i]) return 0;
  }
  return 1;
}
bool cmp3(string x, string y) {
  if (x.size() == 0) return 0;
  if (y.size() == 0) return 1;
  return x.size() < y.size();
}
void solve(long long n) {
  printf("? 1 %lld\n", n);
  fflush(stdout);
  if (n == 1) {
    scanf("%s", ch);
    printf("! ");
    puts(ch);
    fflush(stdout);
    return;
  }
  for (long long i = 1; i <= n * (n + 1) / 2; i++) {
    scanf("%s", ch);
    sort(ch, ch + strlen(ch), cmp1);
    for (long long j = 0; j < strlen(ch); j++) s[0][i] += ch[j];
  }
  printf("? 2 %lld\n", n);
  fflush(stdout);
  for (long long i = 1; i <= n * (n - 1) / 2; i++) {
    scanf("%s", ch);
    sort(ch, ch + strlen(ch), cmp1);
    for (long long j = 0; j < strlen(ch); j++) s[1][i] += ch[j];
  }
  sort(s[0] + 1, s[0] + n * (n + 1) / 2 + 1, cmp2);
  sort(s[1] + 1, s[1] + n * (n - 1) / 2 + 1, cmp2);
  long long it1 = 1, it2 = 1, it;
  while (it2 <= n * (n - 1) / 2) {
    while (s[0][it1] != s[1][it2]) it1++;
    s[0][it1] = "", it1++, it2++;
  }
  sort(s[0] + 1, s[0] + n * (n + 1) / 2 + 1, cmp3);
  ans[0] = s[0][1][0];
  for (long long i = 2; i <= n; i++) {
    it = 0;
    while (it < i - 1 && s[0][i - 1][it] == s[0][i][it]) it++;
    ans[i - 1] = s[0][i][it];
  }
  fflush(stdout);
}
void print(long long n) {
  printf("! ");
  for (long long i = 0; i < n; i++) putchar(ans[i]);
  fflush(stdout);
}
signed main() {
  long long n = read();
  if (n <= 5) {
    solve(n);
    print(n);
    return 0;
  }
  solve(n + 1 >> 1);
  for (long long i = 1; i <= (n + 1 >> 1); i++)
    w[i] = w[i - 1] + ans[i - 1] - 'a';
  printf("? 1 %lld\n", n);
  fflush(stdout);
  for (long long i = 1; i <= n * (n + 1) / 2; i++) {
    scanf("%s", ch);
    for (long long j = 0; j < strlen(ch); j++) sum[strlen(ch)] += (ch[j] - 'a');
  }
  long long x = 0, t[2] = {0, 0};
  for (long long i = 1; i <= (n >> 1); i++) {
    for (long long j = 1; j < i; j++) {
      for (long long k = 0; k < i - j; k++) x += (ans[n - k - 1] - 'a');
      sum[n - i] -= (sum[n] - x - w[j]), x = 0;
      ;
    }
    sum[n - i] -= (sum[n] - w[i]), t[i & 1] = sum[n] - sum[n - i],
                                         ans[n - i] = 'a' + abs(t[0] - t[1]);
  }
  print(n);
  return 0;
}
