#include <bits/stdc++.h>
using namespace std;
const int N = 4010 + 10, mod = 1e9 + 7;
const int base[2] = {713, 739};
vector<string> get(int l, int r) {
  vector<string> ans;
  if (r < l) return ans;
  cout << "? " << l << ' ' << r << endl;
  int len = (r - l + 1);
  for (int i = 0; i < len * (len + 1) / 2; i++) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    ans.push_back(s);
  }
  return ans;
}
pair<int, int> hsh(string s) {
  pair<long long, long long> ans = {0, 0};
  int n = s.size();
  for (int i = 0; i < n; i++) ans.first = (ans.first * base[0] + s[i]) % mod;
  for (int i = 0; i < n; i++) ans.second = (ans.second * base[1] + s[i]) % mod;
  return ans;
}
map<pair<long long, long long>, int> mp;
bool mark[N];
bool cmp(string s, string t) { return s.size() < t.size(); }
string get(string s, string t) {
  map<char, int> cnt;
  for (auto c : s) cnt[c]++;
  for (auto c : t) cnt[c]--;
  for (auto c : s)
    if (cnt[c]) {
      string ans = "";
      ans += c;
      return ans;
    }
}
int cnt[N][N];
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int m;
  cin >> m;
  int n = (m + 1) / 2;
  string ans = "";
  {
    vector<string> v1 = get(1, n), v2 = get(1, n - 1);
    for (auto u : v1) mp[hsh(u)]++;
    for (auto u : v2) mp[hsh(u)]--;
    vector<string> all;
    for (auto u : v1) {
      if (!mark[u.size()] && mp[hsh(u)]) {
        mark[u.size()] = 1;
        all.push_back(u);
      }
    }
    sort(all.begin(), all.end(), cmp);
    ans = all[0];
    for (int i = 1; i < n; i++) {
      ans = get(all[i], all[i - 1]) + ans;
    }
  }
  while (ans.size() < m) ans += '?';
  vector<string> v = get(1, m);
  for (auto s : v)
    for (auto v : s) cnt[s.size()][v]++;
  for (int i = 0; i < m / 2; i++)
    for (char c = 'a'; c <= 'z'; c++) {
      int w = cnt[i + 1][c] - cnt[i][c] - (cnt[i + 2][c] - cnt[i + 1][c]);
      w -= (ans[i] == c);
      if (w) ans[m - i - 1] = c;
    }
  cout << "! " << ans << endl;
}
