#include <bits/stdc++.h>
using namespace std;
vector<vector<long long> > query(long long l, long long r) {
  cout << "? " << l << " " << r << endl;
  vector<vector<long long> > res;
  long long c = (r - l + 1);
  c = c * (c + 1) / 2;
  for (long long i = 0; i < c; i++) {
    string s;
    cin >> s;
    vector<long long> cnt(26, 0);
    for (long long j = 0; j < (long long)s.size(); j++) {
      cnt[s[j] - 'a']++;
    }
    res.push_back(cnt);
  }
  return res;
}
bool cmp(vector<long long> a, vector<long long> b) {
  long long c1 = 0, c2 = 0;
  for (long long i = 0; i < 26; i++) {
    c1 += a[i];
    c2 += b[i];
  }
  return c1 < c2;
}
string get_str(long long l, long long r) {
  map<vector<long long>, long long> mp;
  vector<vector<long long> > p = query(l, r);
  vector<vector<long long> > p1 = query(l + 1, r);
  for (auto x : p) {
    mp[x]++;
  }
  for (auto x : p1) {
    mp[x]--;
  }
  vector<long long> cnt1(26, 0);
  vector<vector<long long> > p2;
  for (auto it : mp) {
    if (it.second) {
      p2.push_back(it.first);
    }
  }
  sort(p2.begin(), p2.end(), cmp);
  vector<long long> cnt(26, 0);
  string s = "";
  for (long long i = 0; i < (long long)p2.size(); i++) {
    for (long long j = 0; j < 26; j++) {
      if (p2[i][j] > cnt[j]) {
        cnt[j]++;
        char t = j + 'a';
        s += t;
      }
    }
  }
  return s;
}
signed main() {
  long long n;
  cin >> n;
  map<vector<long long>, long long> mp;
  if (n == 1) {
    vector<vector<long long> > p = query(1, n);
    for (long long i = 0; i < 26; i++) {
      if (p[0][i]) {
        char t = 'a' + i;
        cout << "! " << t << endl;
      }
    }
    return 0;
  }
  if (n == 2) {
    string s = get_str(1, 2);
    cout << "! " << s << endl;
    return 0;
  }
  string s_first_half = get_str(1, (n + 1) / 2);
  vector<vector<long long> > p = query(1, n);
  vector<char> str(n + 1);
  for (long long i = 1; i <= n / 2; i++) {
    str[i] = s_first_half[i - 1];
  }
  vector<long long> cnt_pred;
  for (long long i = 0; i < (long long)p.size(); i++) {
    long long s = 0;
    for (long long j = 0; j < 26; j++) {
      s += p[i][j];
    }
    if (s == n) {
      cnt_pred = p[i];
    }
  }
  vector<vector<long long> > cnt(n + 2, vector<long long>(26));
  cnt[1] = cnt_pred;
  for (long long i = 1; i <= (n + 1) / 2; i++) {
    vector<long long> cnt_t(26);
    for (long long j = 0; j < (long long)p.size(); j++) {
      long long s = 0;
      for (long long t = 0; t < 26; t++) {
        s += p[j][t];
      }
      if (s == i + 1) {
        for (long long t = 0; t < 26; t++) {
          cnt_t[t] += p[j][t];
        }
      } else if (s == i) {
        for (long long t = 0; t < 26; t++) {
          cnt_t[t] -= p[j][t];
        }
      }
    }
    for (long long j = 0; j < 26; j++) {
      cnt[i + 1][j] = cnt_t[j];
    }
  }
  for (long long i = 1; i <= (n + 1) / 2; i++) {
    for (long long j = 0; j < 26; j++) {
      long long dlp = cnt[i][j] - cnt[i + 1][j];
      char t = 'a' + j;
      if (str[i] == t) {
        dlp--;
      }
      if (dlp) {
        str[n - i + 1] = t;
      }
    }
  }
  cout << "! ";
  for (long long i = 1; i <= n; i++) {
    cout << str[i];
  }
  cout << endl;
  return 0;
}
