#include <bits/stdc++.h>
using namespace std;
vector<int> operator+(vector<int> a, vector<int> b) {
  vector<int> c(26);
  for (int i = 0; i < (26); i++) c[i] = a[i] + b[i];
  return c;
}
vector<int> operator-(vector<int> a, vector<int> b) {
  vector<int> c(26);
  for (int i = 0; i < (26); i++) c[i] = a[i] - b[i];
  return c;
}
vector<vector<int> > query(int l, int r) {
  printf("? %d %d\n", l, r);
  fflush(stdout);
  int len = (r - l + 1);
  vector<vector<int> > res;
  for (int i = 0; i < (len * (len + 1) / 2); i++) {
    char buf[120];
    scanf("%s", buf);
    vector<int> v(26);
    for (int a = 0; buf[a]; a++) v[buf[a] - 'a']++;
    res.push_back(v);
  }
  return res;
}
vector<pair<pair<int, int>, int> > P;
int Get(vector<int> v) {
  int res = 0;
  for (int i = 0; i < (26); i++)
    if (v[i] % 2) res |= 1 << i;
  return res;
}
int get_sum(vector<int> v) {
  int s = 0;
  for (int i = 0; i < (26); i++) s += v[i];
  return s;
}
void Do(int l, int r) {
  auto v = query(l, r);
  int len = r - l + 1;
  vector<vector<int> > L[120];
  for (auto ele : v) L[get_sum(ele)].push_back(ele);
  vector<int> S[120];
  for (int t = 1; t <= (len + 1) / 2; t++) {
    vector<int> sum(26);
    for (auto ele : L[t]) {
      sum = sum + ele;
    }
    S[t] = sum;
  }
  for (int t = (len + 1) / 2; t > 1; t--) S[t] = S[t] - S[t - 1];
  for (int t = 1; t < (len + 1) / 2; t++) S[t] = S[t] - S[t + 1];
  for (int t = 1; t <= (len + 1) / 2; t++) {
    int lidx = t, ridx = len + 1 - t;
    lidx += l - 1, ridx += l - 1;
    P.push_back({pair<int, int>(lidx, ridx), Get(S[t])});
  }
}
int ans[130];
int main() {
  int n;
  scanf("%d", &n);
  int h = n - n / 3;
  Do(1, h);
  if (h > 1) Do(1, h - 1);
  if (h < n) Do(2 * h + 1 - n, n);
  memset(ans, -1, sizeof ans);
  for (int tt = 0; tt < (n); tt++) {
    for (auto ele : P) {
      int x = ele.first.first, y = ele.first.second, g = ele.second;
      if (x == y) {
        ans[x] = g;
      } else if (ans[x] != -1)
        ans[y] = g ^ ans[x];
      else if (ans[y] != -1)
        ans[x] = g ^ ans[y];
    }
  }
  printf("! ");
  for (int i = 1; i <= n; i++) printf("%c", __builtin_ctz(ans[i]) + 'a');
  puts("");
  return 0;
}
