#include <bits/stdc++.h>
using namespace std;
char res[101];
int full[51][2], lhf[50][2];
void func(int n) {
  int i, j, k;
  string str;
  vector<string> sub[101], subl[100];
  cout << "? 1 " << n << endl;
  for (i = 1; 2 * i <= n * (n + 1); i++) {
    cin >> str;
    sub[str.length()].push_back(str);
  }
  for (i = 1; i <= n / 2; i++) {
    int cnt[26];
    memset(cnt, 0, sizeof cnt);
    for (auto s : sub[i + 1]) {
      for (j = 0; j < s.length(); j++) cnt[s[j] - 'a']++;
    }
    for (j = 1; j < i; j++) {
      cnt[full[j][0] - 'a'] -= j;
      cnt[full[j][1] - 'a'] -= j;
    }
    for (j = 0; j < 26; j++) {
      if (cnt[j] % (i + 1)) {
        full[i][0] = j + 'a';
        break;
      }
    }
    for (j++; j < 26; j++) {
      if (cnt[j] % (i + 1)) {
        full[i][1] = j + 'a';
        break;
      }
    }
    if (full[i][1] == 0) full[i][1] = full[i][0];
    if (full[i][0] == 0) {
      memset(cnt, 0, sizeof cnt);
      for (j = 0; j < n; j++) cnt[sub[n][0][j] - 'a']++;
      for (j = 0; j < n - 1; j++) cnt[sub[n - 1][0][j] - 'a']--;
      for (j = 0; j < 26; j++)
        if (cnt[j]) {
          full[i][0] = j + 'a';
          full[i][1] = j + 'a';
        }
    }
  }
  if (n & 1) {
    int cnt[26];
    memset(cnt, 0, sizeof cnt);
    for (i = 0; i < n; i++) cnt[sub[n][0][i] - 'a']++;
    for (i = 1; i <= n / 2; i++) {
      cnt[full[i][0] - 'a']--;
      cnt[full[i][1] - 'a']--;
    }
    for (i = 0; i < 26; i++)
      if (cnt[i]) {
        full[n / 2 + 1][0] = i + 'a';
        full[n / 2 + 1][1] = i + 'a';
        break;
      }
  }
  cout << "? 1 " << n - 1 << endl;
  for (i = 1; 2 * i <= n * (n - 1); i++) {
    cin >> str;
    subl[str.length()].push_back(str);
  }
  for (i = 1; i <= (n - 1) / 2; i++) {
    int cnt[26];
    memset(cnt, 0, sizeof cnt);
    for (auto s : subl[i + 1]) {
      for (j = 0; j < s.length(); j++) cnt[s[j] - 'a']++;
    }
    for (j = 1; j < i; j++) {
      cnt[lhf[j][0] - 'a'] -= j;
      cnt[lhf[j][1] - 'a'] -= j;
    }
    for (j = 0; j < 26; j++) {
      if (cnt[j] % (i + 1)) {
        lhf[i][0] = j + 'a';
        break;
      }
    }
    for (j++; j < 26; j++) {
      if (cnt[j] % (i + 1)) {
        lhf[i][1] = j + 'a';
        break;
      }
    }
    if (lhf[i][1] == 0) lhf[i][1] = lhf[i][0];
    if (lhf[i][0] == 0) {
      memset(cnt, 0, sizeof cnt);
      for (j = 0; j < n - 1; j++) cnt[subl[n - 1][0][j] - 'a']++;
      for (j = 0; j < n - 2; j++) cnt[subl[n - 2][0][j] - 'a']--;
      for (j = 0; j < 26; j++)
        if (cnt[j]) {
          lhf[i][0] = j + 'a';
          lhf[i][1] = j + 'a';
        }
    }
  }
  if ((n - 1) & 1) {
    int cnt[26];
    memset(cnt, 0, sizeof cnt);
    for (i = 0; i < n - 1; i++) cnt[subl[n - 1][0][i] - 'a']++;
    for (i = 1; i <= (n - 1) / 2; i++) {
      cnt[lhf[i][0] - 'a']--;
      cnt[lhf[i][1] - 'a']--;
    }
    for (i = 0; i < 26; i++)
      if (cnt[i]) {
        lhf[(n - 1) / 2 + 1][0] = i + 'a';
        lhf[(n - 1) / 2 + 1][1] = i + 'a';
        break;
      }
  }
  int cnt[26];
  memset(cnt, 0, sizeof cnt);
  for (i = 0; i < n; i++) cnt[sub[n][0][i] - 'a']++;
  for (i = 0; i < n - 1; i++) cnt[subl[n - 1][0][i] - 'a']--;
  for (i = 0; i < 26; i++)
    if (cnt[i]) {
      res[n - 1] = i + 'a';
      break;
    }
  i = 0;
  k = 1;
  while (1) {
    if (k == 1) {
      int temp = (full[i + 1][0] + full[i + 1][1] - (int)res[n - i - 1]);
      res[i] = temp;
      if (i >= n - i - 2) break;
      i = n - i - 2;
      k = -k;
    } else {
      int temp = (lhf[n - i - 1][0] + lhf[n - i - 1][1] - (int)res[n - i - 2]);
      res[i] = temp;
      if (i <= n - i - 1) break;
      i = n - i - 1;
      k = -k;
    }
  }
  res[n] = 0;
}
int main() {
  int i, j, k;
  int n;
  vector<string> sub[101], subl[100];
  string str;
  cin >> n;
  if (n <= 3) {
    cout << "? 1 1" << endl;
    cin >> str;
    res[0] = str[0];
    if (n > 1) {
      cout << "? 2 2" << endl;
      cin >> str;
      res[1] = str[0];
    }
    if (n > 2) {
      cout << "? 3 3" << endl;
      cin >> str;
      res[2] = str[0];
    }
    res[n] = 0;
    cout << "! " << res << endl;
    return 0;
  }
  func(n / 2);
  memset(full, 0, sizeof full);
  cout << "? 1 " << n << endl;
  for (i = 1; 2 * i <= n * (n + 1); i++) {
    cin >> str;
    sub[str.length()].push_back(str);
  }
  for (i = 1; i <= n / 2; i++) {
    int cnt[26];
    memset(cnt, 0, sizeof cnt);
    for (auto s : sub[i + 1]) {
      for (j = 0; j < s.length(); j++) cnt[s[j] - 'a']++;
    }
    for (j = 1; j < i; j++) {
      cnt[full[j][0] - 'a'] -= j;
      cnt[full[j][1] - 'a'] -= j;
    }
    for (j = 0; j < 26; j++) {
      if (cnt[j] % (i + 1)) {
        full[i][0] = j + 'a';
        break;
      }
    }
    for (j++; j < 26; j++) {
      if (cnt[j] % (i + 1)) {
        full[i][1] = j + 'a';
        break;
      }
    }
    if (full[i][1] == 0) full[i][1] = full[i][0];
    if (full[i][0] == 0) {
      memset(cnt, 0, sizeof cnt);
      for (j = 0; j < n; j++) cnt[sub[n][0][j] - 'a']++;
      for (j = 0; j < n - 1; j++) cnt[sub[n - 1][0][j] - 'a']--;
      for (j = 0; j < 26; j++)
        if (cnt[j]) {
          full[i][0] = j + 'a';
          full[i][1] = j + 'a';
        }
    }
  }
  if (n & 1) {
    int cnt[26];
    memset(cnt, 0, sizeof cnt);
    for (i = 0; i < n; i++) cnt[sub[n][0][i] - 'a']++;
    for (i = 1; i <= n / 2; i++) {
      cnt[full[i][0] - 'a']--;
      cnt[full[i][1] - 'a']--;
    }
    for (i = 0; i < 26; i++)
      if (cnt[i]) {
        res[n / 2] = i + 'a';
        break;
      }
  }
  for (i = 0; i < n / 2; i++)
    res[n - i - 1] = full[i + 1][0] + full[i + 1][1] - (int)res[i];
  res[n] = 0;
  cout << "! " << res << endl;
}
