#include <bits/stdc++.h>
using namespace std;
int n;
char c[3][200];
void qf(int w, int l, int ri) {
  cout << "? " << l << " " << ri << endl;
  vector<string> r[200];
  int cn[200][30];
  int nn = ri - l + 1;
  for (int i = 0; i <= nn; i++)
    for (int j = 0; j < 26; j++) cn[i][j] = 0;
  for (int i = 0; i < nn * (nn + 1) / 2; i++) {
    string t;
    cin >> t;
    r[((int)((t).size()))].push_back(t);
    for (int j = 0; j < ((int)((t).size())); j++)
      cn[((int)((t).size()))][t[j] - 'a']++;
  }
  int c1[30];
  for (int i = 0; i < 26; i++) c1[i] = cn[1][i];
  for (int i = 0; i <= nn - i - 1; i++) {
    char ch[2];
    int h = 0;
    for (int j = 0; j < 26; j++) {
      for (int k = 0; k < cn[i + 1][j] + c1[j] - cn[i + 2][j]; k++)
        ch[h++] = 'a' + j;
    }
    c[w][i] = ch[0];
    c1[ch[0] - 'a']--;
    if (i != nn - i - 1) c[w][nn - i - 1] = ch[1], c1[ch[1] - 'a']--;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(10);
  cin >> n;
  qf(0, 1, n);
  if (n > 1) {
    qf(1, 1, n / 2);
    if (n > 3) {
      qf(2, 1, n / 2 - 1);
      int i = (n / 2 - 1) / 2;
      while (i != n / 2 - 1) {
        if (i < (n / 2) / 2) {
          int in = n / 2 - 1 - i;
          if (c[1][i] != c[2][i]) swap(c[1][i], c[1][in]);
          i = in;
        } else {
          int in = n / 2 - 2 - i;
          if (c[1][i] != c[2][i]) swap(c[2][i], c[2][in]);
          i = in;
        }
      }
    }
    for (int i = 0; i < n / 2; i++)
      if (c[0][i] != c[1][i]) swap(c[0][i], c[0][n - 1 - i]);
  }
  cout << "! ";
  for (int i = 0; i < n; i++) cout << c[0][i];
  cout << endl;
}
