#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int sum[maxn], p[maxn], f[maxn][maxn];
string c[maxn];
map<string, int> Map[3][maxn];
inline string Solve(int n) {
  string s = "", S;
  printf("? 1 %d\n", n);
  fflush(stdout);
  for (int i = (1), _end_ = (n * (n + 1) / 2); i <= _end_; ++i) {
    cin >> S;
    sort(S.begin(), S.end());
    ++Map[1][S.length()][S];
  }
  if (n == 1) return S;
  printf("? 1 %d\n", n - 1);
  fflush(stdout);
  for (int i = (1), _end_ = (n * (n - 1) / 2); i <= _end_; ++i) {
    cin >> S;
    sort(S.begin(), S.end());
    ++Map[2][S.length()][S];
  }
  for (int i = (1), _end_ = (n); i <= _end_; ++i) {
    for (auto j : Map[1][i])
      if (Map[2][i][j.first] < j.second) {
        S = j.first;
        break;
      }
    for (int j = (0), _end_ = (25); j <= _end_; ++j) p[j] = 0;
    for (auto j : S) ++p[j - 'a'];
    for (int j = (0), _end_ = (25); j <= _end_; ++j)
      if (p[j] > sum[j]) {
        ++sum[j];
        s = c[j] + s;
      }
  }
  return s;
}
inline string Query(string s, int n) {
  string S;
  printf("? 1 %d\n", n);
  for (int i = (1), _end_ = (n * (n + 1) / 2); i <= _end_; ++i) {
    cin >> S;
    for (auto j : S) ++f[S.length()][j - 'a'];
  }
  for (int i = (0), _end_ = (25); i <= _end_; ++i) sum[i] = 0;
  if (n & 1)
    for (int j = (0), _end_ = (25); j <= _end_; ++j)
      if (f[n / 2 + 1][j] - f[n / 2][j] > 0) {
        ++sum[j];
        s = s + c[j];
      }
  for (int i = n / 2 - 1; i >= 0; --i) {
    ++sum[s[i] - 'a'];
    for (int j = (0), _end_ = (25); j <= _end_; ++j)
      if (f[i + 1][j] - f[i][j] > sum[j]) {
        ++sum[j];
        s = s + c[j];
      }
  }
  return s;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = (0), _end_ = (25); i <= _end_; ++i) c[i] = i + 'a';
  if (n <= 1) {
    string s = Solve(n);
    printf("! ");
    cout << s << endl;
    return 0;
  }
  string s = Solve(n / 2);
  s = Query(s, n);
  printf("! ");
  cout << s << endl;
  return 0;
}
