#include <bits/stdc++.h>
using namespace std;
inline long long mod(long long n, long long m) {
  long long ret = n % m;
  if (ret < 0) ret += m;
  return ret;
}
long long gcd(long long a, long long b) { return (b == 0 ? a : gcd(b, a % b)); }
long long exp(long long a, long long b, long long m) {
  if (b == 0) return 1;
  if (b == 1) return mod(a, m);
  long long k = mod(exp(a, b / 2, m), m);
  if (b & 1) {
    return mod(a * mod(k * k, m), m);
  } else
    return mod(k * k, m);
}
long long n;
map<string, long long> m1, m2;
long long cnt[30];
long long cnt2[30];
long long cmp(string a, string b) { return a.size() < b.size(); }
long long cnt3[110][30];
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  long long N;
  cin >> N;
  if (N == 1) {
    cout << "? 1 1"
         << "\n";
    cout.flush();
    string s;
    cin >> s;
    cout << "! " << s << "\n";
    return 0;
  }
  long long n = N / 2;
  cout << "? " << 1 << " " << n << "\n";
  cout.flush();
  string s;
  for (long long i = 0; i < (n * (n + 1)) / 2; i++) {
    cin >> s;
    sort(s.begin(), s.end());
    m1[s]++;
  }
  string t = "";
  if (n == 1) {
    t = s;
  } else {
    cout << "? " << 1 << " " << n - 1 << "\n";
    cout.flush();
    for (long long i = 0; i < (n * (n - 1)) / 2; i++) {
      cin >> s;
      sort(s.begin(), s.end());
      m1[s]--;
    }
    vector<string> v;
    for (map<string, long long>::iterator it = m1.begin(); it != m1.end();
         it++) {
      if (it->second > 0) v.push_back(it->first);
    }
    sort(v.begin(), v.end(), cmp);
    for (long long i = 0; i < v.size(); i++) {
      string x = v[i];
      for (long long j = 0; j < 26; j++) {
        cnt2[j] = 0;
      }
      for (long long j = 0; j < x.size(); j++) {
        cnt2[x[j] - 'a']++;
      }
      for (long long j = 0; j < 26; j++) {
        if (cnt[j] != cnt2[j]) {
          t += 'a' + j;
          cnt[j]++;
          break;
        }
      }
    }
    reverse(t.begin(), t.end());
  }
  while (t.size() < N) t += '?';
  cout << "? " << 1 << " " << N << "\n";
  cout.flush();
  for (long long i = 0; i < N * (N + 1) / 2; i++) {
    cin >> s;
    sort(s.begin(), s.end());
    for (long long j = 0; j < s.size(); j++) {
      cnt3[s.size()][s[j] - 'a']++;
    }
  }
  for (long long i = 1; i <= n; i++) {
    for (long long j = 0; j < 26; j++) {
      long long c1 = cnt3[i + 1][j] - cnt3[i][j];
      long long c2 = cnt3[i + 2][j] - cnt3[i + 1][j];
      long long vez = c1 - c2;
      if (vez == 0) continue;
      if (vez == 2) {
        t[N - 1 - i] = 'a' + j;
      } else {
        if (t[i] == 'a' + j) {
        } else
          t[N - 1 - i] = 'a' + j;
      }
    }
  }
  memset(cnt, 0, sizeof(cnt));
  for (long long i = 0; i < t.size(); i++) {
    if (t[i] != '?') cnt[t[i] - 'a']++;
  }
  for (long long j = 0; j < 26; j++) {
    if (cnt3[N][j] != cnt[j]) t[N - 1] = 'a' + j;
  }
  cout << "! " << t << "\n";
  cout.flush();
}
