#include <bits/stdc++.h>
using namespace std;
int cnt[3005];
char ans[3005];
vector<int> vis1[105], vis2[105];
vector<string> edge1[105], edge2[105], edge3[105];
void solve(int n) {
  cout << "?"
       << " " << 1 << " " << n << endl;
  cout.flush();
  for (int i = 1; i <= ((1 + n) * n / 2); i++) {
    string s;
    cin >> s;
    int len = s.size();
    sort(s.begin(), s.end());
    edge1[len].push_back(s);
    vis1[len].push_back(0);
  }
  if (n == 1) {
    ans[1] = edge1[1][0][0];
    return;
  }
  cout << "?"
       << " " << 1 << " " << n - 1 << endl;
  cout.flush();
  for (int i = 1; i <= (n * (n - 1) / 2); i++) {
    string s;
    cin >> s;
    int len = s.size();
    sort(s.begin(), s.end());
    edge2[len].push_back(s);
    vis2[len].push_back(0);
  }
  for (int i = 1; i <= n; i++) {
    int len1 = edge1[i].size();
    int len2 = edge2[i].size();
    for (int j = 0; j < len1; j++) {
      int flag = true;
      for (int k = 0; k < len2; k++)
        if (!vis2[i][k] && edge1[i][j] == edge2[i][k]) {
          vis2[i][k] = 1;
          flag = false;
          break;
        }
      if (flag) {
        memset(cnt, 0, sizeof(cnt));
        int len = edge1[i][j].size();
        for (int k = 0; k < len; k++) cnt[edge1[i][j][k]]++;
        for (int k = 1; k < i; k++) cnt[ans[k]]--;
        for (int k = 'a'; k <= 'z'; k++)
          if (cnt[k]) {
            ans[i] = k;
            break;
          }
        break;
      }
    }
  }
  for (int i = 1; i <= n / 2; i++) swap(ans[i], ans[n - i + 1]);
}
int dp[105][3005];
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    cout << "?"
         << " " << 1 << " " << n << endl;
    cout.flush();
    string s;
    cin >> s;
    cout << "!"
         << " " << s << endl;
    return 0;
  }
  solve(n / 2);
  cout << "?"
       << " " << 1 << " " << n << endl;
  cout.flush();
  for (int i = 1; i <= ((1 + n) * n / 2); i++) {
    string s;
    cin >> s;
    int len = s.size();
    for (int j = 0; j < len; j++) {
      dp[len][s[j]]++;
    }
  }
  for (int i = (n - 1) / 2; i >= 0; i--) {
    memset(cnt, 0, sizeof(cnt));
    for (int j = 'a'; j <= 'z'; j++) {
      cnt[j] += (dp[i + 1][j] - dp[i][j]);
    }
    for (int j = i + 1; j <= n - i; j++) {
      cnt[ans[j]]--;
    }
    for (int j = 'a'; j <= 'z'; j++) {
      if (cnt[j] > 0) {
        ans[n - i] = j;
        break;
      }
    }
  }
  cout << "!"
       << " ";
  for (int i = 1; i <= n; i++) cout << ans[i];
}
