#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:256000000")
using namespace std;
const long double Ma_PI = 3.1415926535897932384626433832795028841971L;
void init() {
  iostream::sync_with_stdio(false);
  cout << fixed << setprecision(20);
}
unsigned long xor128() {
  static unsigned long x = 123456789, y = 362436069, z = 521288629,
                       w = 88675123;
  unsigned long t = (x ^ (x << 11));
  x = y;
  y = z;
  z = w;
  return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)));
}
void solve() {
  long long final_n;
  cin >> final_n;
  if (final_n <= 3) {
    long long n = final_n;
    string ans;
    for (long long i = 1; i <= n; ++i) {
      cout << "? " << i << " " << i << endl;
      string s;
      cin >> s;
      ans += s;
    }
    cout << "! " << ans << endl;
    return;
  }
  long long n = (final_n + 1) / 2;
  string ans;
  for (long long i = 0; i < n; ++i) {
    ans.push_back('?');
  }
  reverse((ans).begin(), (ans).end());
  vector<string> inputs[3][200];
  for (long long i = 0; i < 2; ++i) {
    cout << "? 1 " << n - i << endl;
    long long hoge = (n - i) * (n - i + 1) / 2LL;
    for (long long q = 0; q < hoge; ++q) {
      string s;
      cin >> s;
      sort((s).begin(), (s).end());
      inputs[i][s.length()].push_back(s);
    }
    for (long long q = 0; q < 200; ++q) {
      sort((inputs[i][q]).begin(), (inputs[i][q]).end());
    }
  }
  long long cnt[26] = {};
  for (auto x : inputs[0][n][0]) {
    cnt[x - 'a']++;
  }
  for (long long i = n - 1; i >= 1; --i) {
    map<string, long long> cnt_st;
    for (long long q = 0; q < inputs[1][i].size(); ++q) {
      cnt_st[inputs[1][i][q]]--;
    }
    for (long long q = 0; q < inputs[0][i].size(); ++q) {
      cnt_st[inputs[0][i][q]]++;
      continue;
      long long ok = 1;
      for (long long j = 0; j < inputs[1][i].size(); ++j) {
        if (inputs[1][i][j] == inputs[0][i][q]) {
          ok = 0;
          break;
        }
      }
      if (ok == 1) {
        long long copy_cnt[26] = {};
        for (long long q = 0; q < 26; ++q) {
          copy_cnt[q] = cnt[q];
        }
        for (auto x : inputs[0][i][q]) {
          copy_cnt[x - 'a']--;
        }
        for (long long t = 0;; ++t) {
          if (copy_cnt[t] == 1) {
            cnt[t]--;
            ans[n - i - 1] = (char)(t + 'a');
            break;
          }
        }
        break;
      }
    }
    for (auto x : cnt_st) {
      if (x.second == 0) continue;
      long long copy_cnt[26] = {};
      for (long long q = 0; q < 26; ++q) {
        copy_cnt[q] = cnt[q];
      }
      for (auto s : x.first) {
        copy_cnt[s - 'a']--;
      }
      for (long long t = 0;; ++t) {
        if (copy_cnt[t] == 1) {
          cnt[t]--;
          ans[n - i - 1] = (char)(t + 'a');
          break;
        }
      }
      break;
    }
  }
  for (long long i = 0; i < 26; ++i) {
    if (cnt[i] == 1) {
      ans.back() = 'a' + i;
      break;
    }
  }
  cout << "? " << 1 << " " << final_n << endl;
  for (long long i = 0; i < final_n * (final_n + 1) / 2; ++i) {
    string s;
    cin >> s;
    sort((s).begin(), (s).end());
    inputs[2][s.length()].push_back(s);
  }
  while (ans.length() != final_n) {
    ans.push_back('?');
  }
  for (long long i = 1; i <= final_n - n; ++i) {
    long long cnt[26] = {};
    for (long long t = 0; t < i; ++t) {
      cnt[ans[t] - 'a'] -= t + 1;
      if (ans[ans.length() - t - 1] != '?') {
        cnt[ans[ans.length() - t - 1] - 'a'] -= t + 1;
      }
    }
    for (auto x : inputs[2][final_n - i]) {
      for (long long q = 0; q < x.length(); ++q) {
        cnt[x[q] - 'a']++;
      }
    }
    for (long long q = 0; q < 26; ++q) {
      if (cnt[q] % (i + 1) != 0) {
        ans[ans.length() - i] = (char)(q + 'a');
        break;
      }
    }
  }
  cout << "! " << ans << endl;
  return;
}
int main() {
  init();
  solve();
}
