#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Charvec {
  const static int N = 26;
  using A = array<int, N>;
  A vec;
  void operator+=(const Charvec &o) {
    for (int i = 0; i < N; ++i) vec[i] += o.vec[i];
  }
  void operator-=(const Charvec &o) {
    for (int i = 0; i < N; ++i) vec[i] -= o.vec[i];
  }
  Charvec() : vec() {}
  Charvec(string &s) : vec() {
    for (char c : s) vec[c - 'a']++;
  }
  Charvec(char c) : vec() { vec[c - 'a'] = 1; }
  char get() {
    for (int i = 0; i < N; ++i)
      if (vec[i]) return 'a' + i;
    return 0;
  }
  void dbg_print() {
    for (int x = 0; x < Charvec::N; ++x)
      if (vec[x]) cout << char('a' + x) << " " << vec[x] << endl;
  }
};
vector<Charvec> mkq(int i, int j) {
  int n = j - i + 1;
  cout << "? " << i + 1 << " " << j + 1 << endl;
  vector<Charvec> g(n);
  for (int a = 0; a < n * (n + 1) / 2; ++a) {
    string s;
    cin >> s;
    if (s.size() > (n + 1) / 2) continue;
    g[s.size() - 1] += s;
  }
  Charvec w{};
  for (int s = (n + 1) / 2 - 1; s >= 0; --s) {
    if (s) g[s] -= g[s - 1];
    g[s] -= w;
    w += g[s];
  }
  for (int s = (n + 1) / 2; s < n; ++s) {
    g[s] = g[n - s - 1];
  }
  return g;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  string s(n, 0);
  auto q1 = mkq(0, n - 1);
  if (n % 2) s[(n - 1) / 2] = q1[(n - 1) / 2].get();
  if (n > 1) {
    int m = n / 2;
    auto q2 = mkq(0, m - 1);
    if (m % 2) s[(m - 1) / 2] = q2[(m - 1) / 2].get();
    if (m > 1) {
      auto q3 = mkq(0, m - 2);
      int i = (m - 1) / 2;
      bool n3 = m % 2;
      char cc = (n3 ? q2 : q3)[i].get();
      s[i] = cc;
      for (int a = 1; a < m; ++a) {
        auto cv = (n3 ? q3 : q2)[i];
        cv -= cc;
        cc = cv.get();
        i = n3 ? m - i - 2 : m - i - 1;
        s[i] = cc;
        n3 = !n3;
      }
    }
  }
  for (int i = (n + 1) / 2; i < n; ++i) {
    auto cv = q1[i];
    cv -= s[n - i - 1];
    s[i] = cv.get();
  }
  cout << "! " << s << endl;
}
