#include <bits/stdc++.h>
using namespace std;
template <class T>
void cmax(T &a, T b) {
  a = (a > b ? a : b);
}
template <class T>
void cmin(T &a, T b) {
  a = (a > b ? b : a);
}
long long n;
map<string, long long> mp;
string s;
struct data {
  long long a[26];
  void init() { memset(a, 0, sizeof(a)); }
  long long &operator[](long long i) { return a[i]; }
  data operator-(data b) {
    data res;
    res.init();
    long long i;
    for (i = (0); i <= (25); ++i) res[i] = a[i] - b[i];
    return res;
  }
  data operator+(data b) {
    data res;
    res.init();
    long long i;
    for (i = (0); i <= (25); ++i) res[i] = a[i] + b[i];
    return res;
  }
  long long find() {
    long long i;
    for (i = (0); i <= (25); ++i)
      if (a[i]) return i;
    return -1;
  }
} a[110];
data count(string s) {
  long long i;
  data res;
  res.init();
  for (i = (0); i <= ((long long)s.length() - 1); ++i) ++res[s[i] - 'a'];
  return res;
}
bool cmp(string s1, string s2) { return s1.length() > s2.length(); }
string get_s(long long len) {
  string temp, s;
  printf("? %lld %lld\n", 1ll, len);
  fflush(stdout);
  long long i;
  for (i = (1); i <= ((len + 1) * len / 2); ++i) {
    cin >> temp;
    sort(temp.begin(), temp.end());
    ++mp[temp];
  }
  printf("? %lld %lld\n", 2ll, len);
  fflush(stdout);
  for (i = (1); i <= ((len - 1) * len / 2); ++i) {
    cin >> temp;
    sort(temp.begin(), temp.end());
    --mp[temp];
  }
  long long cnt = 0;
  vector<string> vec;
  for (auto it : mp)
    if (it.second) vec.push_back(it.first);
  sort(vec.begin(), vec.end(), cmp);
  for (i = (0); i <= (len - 1); ++i) a[i] = count(vec[i]);
  s.push_back('a' + a[len - 1].find());
  for (i = (len - 1); i >= (1); --i)
    s.push_back('a' + (a[i - 1] - a[i]).find());
  return s;
}
int main() {
  scanf("%lld", &n);
  if (n == 1) {
    string c;
    printf("? %lld %lld\n", 1ll, 1ll);
    fflush(stdout);
    cin >> c;
    cout << "! " << c;
    fflush(stdout);
    return 0;
  }
  if (n == 2) {
    string c, cc;
    printf("? %lld %lld\n", 1ll, 1ll);
    fflush(stdout);
    cin >> c;
    printf("? %lld %lld\n", 2ll, 2ll);
    fflush(stdout);
    cin >> cc;
    cout << "! " << c + cc;
    fflush(stdout);
    return 0;
  }
  s = get_s((n + 1) >> 1);
  long long i;
  for (i = (0); i <= (n + 1); ++i) a[i].init();
  printf("? %lld %lld\n", 1ll, n);
  fflush(stdout);
  string temp;
  for (i = (1); i <= ((n + 1) * n / 2); ++i) {
    cin >> temp;
    a[temp.length()] = a[temp.length()] + count(temp);
  }
  for (i = (1); i <= ((n / 2)); ++i) s = s + ' ';
  data p;
  long long j;
  for (i = (1); i <= (n / 2); ++i) {
    p = a[1] - (a[i + 1] - a[i]);
    for (j = (1); j <= (i); ++j) --p[s[j - 1] - 'a'];
    for (j = (n); j >= (n - i + 2); --j) --p[s[j - 1] - 'a'];
    s[n - i] = p.find() + 'a';
  }
  cout << "! " << s;
  fflush(stdout);
  return 0;
}
