#include <bits/stdc++.h>
using namespace std;
bool comp(string a, string b) { return a.length() < b.length(); }
void sort(string &a) {
  vector<char> boof;
  for (int j = 0; j < a.length(); j++) {
    boof.push_back(a[j]);
  }
  sort(boof.begin(), boof.end());
  for (int j = 0; j < a.length(); j++) {
    a[j] = boof[j];
  }
}
string sbtr(string a, string b) {
  string ans;
  map<char, int> mp;
  for (int i = 0; i < a.length(); i++) {
    mp[a[i]]++;
  }
  for (int i = 0; i < b.length(); i++) {
    mp[b[i]]--;
  }
  for (int i = 0; i < a.length(); i++) {
    if (mp[a[i]] > 0) {
      ans += a[i];
      mp[a[i]]--;
    }
  }
  return ans;
}
string sadd(string a, string b) {
  string ans;
  map<char, int> mp;
  for (int i = 0; i < a.length(); i++) {
    mp[a[i]]++;
  }
  for (int i = 0; i < b.length(); i++) {
    mp[b[i]]++;
  }
  for (int i = 0; i < a.length(); i++) {
    if (mp[a[i]] > 0) {
      ans += a[i];
      mp[a[i]]--;
    }
  }
  for (int i = 0; i < b.length(); i++) {
    if (mp[b[i]] > 0) {
      ans += b[i];
      mp[b[i]]--;
    }
  }
  sort(ans);
  return ans;
}
void read(int n, vector<string> &f) {
  f.resize(n * (n + 1) / 2);
  for (int i = 0; i < f.size(); i++) {
    cin >> f[i];
    sort(f[i]);
  }
  sort(f.begin(), f.end(), comp);
}
char mut(string a, string b) {
  b += '(';
  for (int i = 0; i < a.length(); i++) {
    if (a[i] != b[i]) return a[i];
  }
}
int main() {
  int n;
  cin >> n;
  int m = n;
  n = (n + 1) / 2;
  if (m == 1) {
    string a;
    cout << "? 1 1\n";
    cout.flush();
    cin >> a;
    cout << "! " << a << endl;
    cout.flush();
    return 0;
  }
  cout << "? 1 " << n << endl;
  cout.flush();
  vector<string> f;
  read(n, f);
  vector<string> s;
  if (n != 1) {
    cout << "? 2 " << n << endl;
    cout.flush();
    read(n - 1, s);
  }
  map<string, int> mp;
  for (int i = 0; i < f.size(); i++) {
    mp[f[i]]++;
  }
  for (int i = 0; i < s.size(); i++) {
    mp[s[i]]--;
  }
  vector<string> v;
  for (int i = 0; i < f.size(); i++) {
    if (mp[f[i]] == 1) {
      mp[f[i]] = 0;
      v.push_back(f[i]);
    }
  }
  sort(v.begin(), v.end(), comp);
  string ans = v[0];
  for (int i = 1; i < v.size(); i++) {
    ans += mut(v[i], v[i - 1]);
  }
  cout << "? 1 " << m << endl;
  cout.flush();
  for (int i = n; i < m; i++) {
    ans += '.';
  }
  vector<string> l;
  read(m, l);
  map<string, int> str;
  for (int i = 0; i < l.size(); i++) {
    str[l[i]]++;
  }
  map<char, int> mdlprt;
  for (int i = 0; i < m; i++) {
    mdlprt[l[l.size() - 1][i]]++;
  }
  for (int i = 0; i < n; i++) {
    mdlprt[ans[i]]--;
  }
  map<char, int> wuw;
  for (int i = 0; i < n; i++) {
    wuw[ans[i]]++;
  }
  for (int i = m - 1; i >= n; i--) {
    for (int j = m - 1; j >= i; j--) {
      map<char, int> bf;
      for (int k = j; k > j - i; k--) {
        bf[ans[k]]++;
      }
      for (char k = 'a'; k <= 'z'; k++) {
        bf[k] += mdlprt[k];
      }
      string bbf;
      for (char k = 'a'; k <= 'z'; k++) {
        for (int t = 0; t < bf[k]; t++) bbf += k;
      }
      if (str[bbf] == 0)
        cout << "AAAAAAAAA!\n";
      else
        str[bbf]--;
    }
    string cur;
    for (int j = 0; j < l.size(); j++) {
      if (str[l[j]] != 0 && l[j].length() == i) {
        cur = l[j];
      }
    }
    map<char, int> wow;
    for (int j = 0; j < i; j++) {
      wow[cur[j]]++;
    }
    for (char j = 'a'; j <= 'z'; j++) {
      if (wow[j] == wuw[j] + mdlprt[j] - 1) ans[i] = j;
    }
    mdlprt[ans[i]]--;
  }
  cout << "! " << ans << endl;
  cout.flush();
  return 0;
}
