#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
char str[110];
string s[61];
int num(int x) { return x * (x + 1) / 2; }
void ask(int l, int r) {
  cout << "? " << l << " " << r << "\n";
  cout.flush();
  return;
}
int cnt[61][31];
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    ask(1, 1);
    cout.flush();
    cin >> str;
    cout << "! " << str << "\n";
    cout.flush();
    return 0;
  }
  if (n > 2) {
    ask(1, (n + 1) / 2 - 1);
    for (int i = 1; i <= num((n + 1) / 2 - 1); i++) {
      string st;
      cin >> st;
      sort(st.begin(), st.end());
      mp[st]++;
    }
  }
  ask(1, (n + 1) / 2);
  for (int i = 1; i <= num((n + 1) / 2); i++) {
    string st;
    cin >> st;
    sort(st.begin(), st.end());
    if (mp[st])
      mp[st]--;
    else
      s[st.length()] = st;
  }
  for (int i = 1; i <= (n + 1) / 2; i++) {
    for (int j = 0; j < s[i].length(); j++)
      if (j == s[i].length() - 1 || s[i][j] != s[i - 1][j]) {
        str[(n + 1) / 2 - i + 1] = s[i][j];
        break;
      }
  }
  ask(1, n);
  for (int i = 1; i <= num(n); i++) {
    string st;
    cin >> st;
    if (st.length() <= (n + 1) / 2) {
      for (int j = 0; j < st.length(); j++) cnt[st.length()][st[j] - 'a']++;
    }
  }
  for (int i = (n + 1) / 2; i >= 1; i--)
    for (int j = 0; j < 26; j++) cnt[i][j] -= cnt[i - 1][j];
  for (int i = 1; i <= n / 2; i++)
    for (int j = 0; j < 26; j++) cnt[i][j] -= cnt[i + 1][j];
  for (int i = n / 2; i >= 1; i--) {
    cnt[i][str[i] - 'a']--;
    for (int j = 0; j < 26; j++)
      if (cnt[i][j]) str[n - i + 1] = 'a' + j;
  }
  cout << "! " << str + 1 << "\n";
  return 0;
}
