#include <bits/stdc++.h>
using namespace std;
int n, m, q, k, v[150];
pair<int, int> TT, w[150];
string ans;
multiset<string> query(int l, int r) {
  multiset<string> w;
  cout << "? " << l << " " << r << endl;
  int qtd = (r - l + 1) * (r - l + 2) / 2;
  while (qtd > 0) {
    string second;
    cin >> second;
    sort(begin(second), end(second));
    w.insert(second);
    --qtd;
  }
  return w;
}
bool cmp(string a, string b) { return a.size() < b.size(); }
multiset<string> save[2];
int cnt[150][50];
void solveL() {
  int m = (n + 1) / 2;
  auto A = query(1, m);
  auto B = query(1, m - 1);
  save[0] = A;
  save[1] = B;
  auto aux = A;
  for (auto w : B) aux.erase(aux.find(w));
  vector<string> caras;
  string total, semi;
  for (auto w : aux) {
    caras.push_back(w);
    if (w.size() == m) total = w;
  }
  for (auto w : B)
    if (w.size() == m - 1) semi = w;
  map<char, int> soma;
  for (auto x : semi) soma[x]++;
  char lst;
  for (auto x : total) {
    if (soma[x] == 0) {
      lst = x;
      break;
    }
    soma[x]--;
  }
  soma.clear();
  ans[m - 1] = lst;
  sort(begin(caras), end(caras), cmp);
  string prev = caras[0];
  for (int i = 1, j = m - 2; i < (int)(caras).size(); i++, j--) {
    char atual;
    for (auto w : prev) soma[w]++;
    for (auto w : caras[i]) {
      if (soma[w] == 0) {
        atual = w;
        break;
      }
      soma[w]--;
    }
    soma.clear();
    prev = caras[i];
    ans[j] = atual;
  }
}
int conta(int x, int l, int r, int tam) {
  int count = 0;
  for (int i = l; i <= r; i++)
    if (ans[i - 1] - 'a' == x) count++;
  return count;
}
int32_t main() {
  cin >> n;
  ans.resize(n);
  if (n == 1) {
    auto a = query(1, 1);
    cout << "! " << *a.begin() << endl;
    return 0;
  } else if (n == 2) {
    auto a = query(1, 1);
    auto b = query(2, 2);
    cout << "! " << (*a.begin()) << (*b.begin()) << endl;
    return 0;
  }
  int m = (n + 1) / 2;
  solveL();
  auto all = query(1, n);
  for (auto ss : all)
    for (auto w : ss) {
      cnt[(int)(ss).size()][w - 'a']++;
    }
  for (int j = m + 1; j <= n; j++) {
    int resp = -1;
    for (int x = 0; x < 26; x++) {
      int i = n - j + 1;
      int ini = i, fim = n - i + 1;
      int qtd = cnt[i][x] - cnt[i - 1][x];
      if (qtd - conta(x, ini, fim - 1, i) > 0) {
        resp = x;
        break;
      }
    }
    ans[j - 1] = resp + 'a';
  }
  cout << "! " << ans << endl;
}
