#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool cmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
template <typename T>
inline bool cmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
int N, M;
string s, a[105], ss;
multiset<string> S;
int c[105][26], sum[26];
int main() {
  cin >> N;
  if (N == 1) {
    cout << "? 1 1" << endl;
    cin >> s;
    cout << "! " << s << endl;
    return 0;
  }
  M = N >> 1;
  if (M == 1) {
    cout << "? 1 1" << endl;
    cin >> ss;
  } else {
    cout << "? 1 " << M << endl;
    for (int i(1), I(M * (M + 1) / 2); i <= I; ++i) {
      cin >> s;
      sort(s.begin(), s.end());
      S.insert(s);
    }
    cout << "? 2 " << M << endl;
    for (int i(1), I(M * (M - 1) / 2); i <= I; ++i) {
      cin >> s;
      sort(s.begin(), s.end());
      S.erase(S.lower_bound(s));
    }
    for (int i(1), I(M); i <= I; ++i)
      a[S.begin()->size()] = *S.begin(), S.erase(S.begin());
    for (int i(1), I(M); i <= I; ++i)
      for (int j(0), I(i - 1); j <= I; ++j)
        if (i == 1 || a[i][j] != a[i - 1][j]) {
          ss += a[i][j];
          break;
        }
  }
  cout << "? 1 " << N << endl;
  for (int i(1), I(N * (N + 1) / 2); i <= I; ++i) {
    cin >> s;
    for (char j : s) ++c[s.size()][j - 'a'];
  }
  cout << "! " + ss;
  if (N & 1)
    for (int i(0), I(25); i <= I; ++i)
      if (c[M + 1][i] - c[M][i] > 0) {
        putchar(i + 'a');
        break;
      }
  for (int i(M), I(1); i >= I; --i)
    for (int j(0), I(25); j <= I; ++j)
      if (c[i][j] - c[i - 1][j] + c[i][j] - c[i + 1][j] -
              (ss[i - 1] == j + 'a') >
          0) {
        putchar(j + 'a');
        break;
      }
  cout << endl;
  return 0;
}
