#include <bits/stdc++.h>
using namespace std;
const int N = 110;
vector<string> vc;
unordered_multiset<string> st;
string ans = "", gt;
int mid, n, kol[26], cur_kol[26], cnt[N][26], real_cnt[N][26];
void calc(int l, int r, bool insrt) {
  cout << "? " << l << " " << r << endl;
  int len = (r - l + 1);
  int kol = (len * (len + 1)) / 2;
  for (; kol; kol--) {
    cin >> gt;
    sort(gt.begin(), gt.end());
    if (insrt)
      st.insert(gt);
    else
      st.erase(st.find(gt));
  }
}
bool cmp(string _x, string _y) { return ((int)_x.size()) < ((int)_y.size()); }
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  if (n < 4) {
    for (int i = 1; i <= n; i++) {
      cout << "? " << i << " " << i << endl;
      cin >> gt;
      ans += gt;
    }
    cout << "! " << ans << endl;
    return 0;
  }
  mid = (n + 1) / 2;
  calc(1, mid, 1);
  calc(2, mid, 0);
  vc.clear();
  for (auto cr : st) vc.push_back(cr);
  sort(vc.begin(), vc.end(), cmp);
  for (int i = 0; i < mid; i++) {
    fill(cur_kol, cur_kol + 26, 0);
    for (int it = 0; it <= i; it++) {
      int ch = vc[i][it] - 'a';
      cur_kol[ch]++;
      if (cur_kol[ch] > kol[ch]) {
        ans += char(ch + 'a');
        kol[ch] = cur_kol[ch];
      }
    }
  }
  mid = n / 2;
  cout << "? 1 " << n << endl;
  int subs = n * (n + 1) / 2;
  for (int it = 0; it < subs; it++) {
    cin >> gt;
    int len = ((int)gt.size());
    if (len == n) {
      fill(cur_kol, cur_kol + 26, 0);
      for (int i = 0; i < n; i++) cur_kol[gt[i] - 'a']++;
    }
    for (int i = 0; i < len; i++) cnt[len][gt[i] - 'a']++;
  }
  for (int i = 2; i <= mid; i++)
    for (int ch = 0; ch < 26; ch++)
      real_cnt[i][ch] = cnt[i][ch] - cnt[i - 1][ch];
  fill(kol, kol + 26, 0);
  if (n & 1) kol[ans[mid] - 'a']++;
  for (int i = mid; i > 1; i--) {
    kol[ans[i - 1] - 'a']++;
    for (int ch = 0; ch < 26; ch++)
      if (kol[ch] != real_cnt[i][ch]) {
        ans += char('a' + ch);
        kol[ch]++;
        break;
      }
  }
  kol[ans[0] - 'a']++;
  for (int ch = 0; ch < 26; ch++)
    if (kol[ch] != cur_kol[ch]) {
      ans += char(ch + 'a');
      break;
    }
  cout << "! " << ans << endl;
  return 0;
}
