#include <bits/stdc++.h>
using namespace std;
class seq {
 public:
  int cnt[26], len;
  bool flag;
  seq() {}
  void init() {
    memset(cnt, 0, sizeof(cnt));
    len = 0;
    flag = 0;
  }
  void read() {
    init();
    string s;
    cin >> s;
    len = s.size();
    for (int i = 0; i < len; i++) cnt[s[i] - 'a']++;
  }
  bool operator==(const seq &s) const {
    if (len != s.len) return 0;
    for (int i = 0; i < 26; i++) {
      if (cnt[i] != s.cnt[i]) return 0;
    }
    return 1;
  }
  seq operator+=(const seq &s) {
    for (int i = 0; i < 26; i++) this->cnt[i] += s.cnt[i];
    return *this;
  }
  seq operator-(const seq &s) const {
    seq ret;
    for (int i = 0; i < 26; i++) ret.cnt[i] = this->cnt[i] - s.cnt[i];
    return ret;
  }
};
inline vector<seq> query(int l, int r) {
  printf("? %d %d\n", l, r);
  fflush(stdout);
  int len = r - l + 1;
  vector<seq> ret;
  for (int i = 1; i <= len * (len + 1) / 2; i++) {
    seq s;
    s.read();
    ret.push_back(s);
  }
  return ret;
}
int n;
seq *pos[110];
char sret[110];
seq pl[110];
int main() {
  vector<seq> l1, l2, T;
  scanf("%d", &n);
  if (n <= 3) {
    string res;
    for (int i = 1; i <= n; i++) {
      printf("? %d %d\n", i, i);
      fflush(stdout);
      string x;
      cin >> x;
      res = res + x;
    }
    cout << "! " << res << endl;
    return 0;
  }
  l1 = query(1, n / 2);
  l2 = query(2, n / 2);
  for (auto &x : l2) {
    for (auto &y : l1) {
      if (!y.flag && x == y) {
        y.flag = 1;
        break;
      }
    }
  }
  for (auto &x : l1) {
    if (!x.flag) {
      pos[x.len] = &x;
    }
  }
  for (int i = 1; i <= n / 2; i++) {
    seq &cur = *pos[i];
    for (int j = 0; j < 26; j++) {
      if (cur.cnt[j]) {
        sret[i] = j + 'a';
        for (int k = i + 1; k <= n / 2; k++) pos[k]->cnt[j]--;
      }
    }
  }
  T = query(1, n);
  for (auto &x : T) pl[x.len] += x;
  for (int i = (n - 1) / 2; i >= 0; i--) {
    seq cur = pl[i + 1] - pl[i];
    for (int j = i + 1; j < n - i; j++) cur.cnt[sret[j] - 'a']--;
    for (int j = 0; j < 26; j++) {
      if (cur.cnt[j]) {
        sret[n - i] = j + 'a';
        break;
      }
    }
  }
  printf("! %s\n", sret + 1);
  return 0;
}
