#include <bits/stdc++.h>
using namespace std;
string solve(int n) {
  cout << "? 1 " << n << endl;
  int lim = n * (n + 1) / 2;
  map<string, int> strings;
  for (int i = 0; i < lim; ++i) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    ++strings[s];
  }
  if (n == 1) {
    for (auto [i, j] : strings) {
      return i;
    }
  }
  cout << "? 1 " << n - 1 << endl;
  lim = n * (n - 1) / 2;
  for (int i = 0; i < lim; ++i) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    --strings[s];
  }
  vector<string> suffixes;
  for (auto [s, cnt] : strings) {
    if (cnt == 1) suffixes.push_back(s);
  }
  sort(suffixes.begin(), suffixes.end(), [](string &first, string &second) {
    return first.size() < second.size();
  });
  string current;
  for (auto i : suffixes) {
    map<char, int> cnts;
    for (auto j : i) ++cnts[j];
    for (auto j : current) --cnts[j];
    for (auto [i, j] : cnts) {
      if (j == 1) current += i;
    }
  }
  reverse(current.begin(), current.end());
  return current;
}
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    string res = solve(n);
    cout << "! " << res << endl;
    return 0;
  }
  int half = n / 2;
  string first = solve(half);
  cout << "? 1 " << n << endl;
  vector<map<char, int>> cnts(n + 1);
  int lim = n * (n + 1) / 2;
  for (int i = 0; i < lim; ++i) {
    string s;
    cin >> s;
    for (auto i : s) {
      ++cnts[s.size()][i];
    }
  }
  for (int i = half; i >= 0; --i) {
    for (char candidate : "abcdefghijklmnopqrstuvwxyz") {
      int cnt = cnts[i + 1][candidate] - cnts[i][candidate];
      for (int j = i; j < first.size(); ++j) {
        if (first[j] == candidate) --cnt;
      }
      if (cnt == 1) {
        first += candidate;
        break;
      }
    }
  }
  cout << "! " << first << endl;
}
