#include <bits/stdc++.h>
using namespace std;
const int MAX = 105;
int mat[MAX][26];
int main() {
  int n, mid;
  string s;
  cin >> n;
  mid = (n + 2) / 2;
  vector<char> sol(n + 1);
  if (n <= 3) {
    for (int i = 1; i <= n; i++) {
      cout << "? " << i << " " << i << endl;
      cin >> s;
      sol[i] = s[0];
    }
    cout << "! ";
    for (int i = 1; i <= n; i++) cout << sol[i];
    cout << endl;
    return 0;
  }
  cout << "? " << 1 << " " << mid << endl;
  for (int i = 0; i < (mid + 1) * mid / 2; i++) {
    cin >> s;
    for (int j = 0; j < s.size(); j++) mat[s.size()][s[j] - 'a']++;
  }
  cout << "? " << 2 << " " << mid << endl;
  for (int i = 0; i < (mid - 1) * mid / 2; i++) {
    cin >> s;
    for (int j = 0; j < s.size(); j++) mat[s.size()][s[j] - 'a']--;
  }
  for (int i = 1; i <= mid; i++) {
    for (int j = 0; j < 26; j++) {
      if (mat[i][j] == 0) continue;
      sol[i] = 'a' + j;
      for (int k = i; k <= mid; k++) mat[k][j]--;
    }
  }
  cout << "? " << 1 << " " << n << endl;
  for (int i = 0; i < (n + 1) * n / 2; i++) {
    cin >> s;
    for (int j = 0; j < s.size(); j++) mat[s.size()][s[j] - 'a']++;
  }
  for (int i = 1; i < mid; i++) {
    for (int j = 0; j < 26; j++) mat[i + 1][j] -= (i + 1) * mat[1][j];
    vector<char> vc;
    for (int j = 0; j < 26; j++) {
      if (mat[i + 1][j] == -2) {
        vc.push_back('a' + j);
        vc.push_back('a' + j);
      } else if (mat[i + 1][j] == -1)
        vc.push_back('a' + j);
    }
    char c1 = vc[0];
    char c2 = vc[1];
    if (c1 == sol[i]) swap(c1, c2);
    sol[n - i + 1] = c1;
    for (int z = i + 1; z <= mid; z++) {
      mat[z][c1 - 'a'] += z - i;
      mat[z][c2 - 'a'] += z - i;
    }
  }
  cout << "! ";
  for (int i = 1; i <= n; i++) cout << sol[i];
  cout << endl;
}
