#include <bits/stdc++.h>   using namespace std;   template <class T>   void _R(T &x) {     cin >> x;   }   void _R(int &x) { scanf( %d , &x); }   void _R(long long &x) { scanf( %lld , &x); }   void _R(double &x) { scanf( %lf , &x); }   void _R(char &x) { scanf(  %c , &x); }   void _R(char *x) { scanf( %s , x); }   void R() {}   template <class T, class... U>   void R(T &head, U &...tail) {     _R(head);     R(tail...);   }   template <class T>   void _W(const T &x) {     cout << x;   }   void _W(const int &x) { printf( %d , x); }   void _W(const long long &x) { printf( %lld , x); }   void _W(const double &x) { printf( %.16f , x); }   void _W(const char &x) { putchar(x); }   void _W(const char *x) { printf( %s , x); }   template <class T, class U>   void _W(const pair<T, U> &x) {     _W(x.first);     putchar(   );     _W(x.second);   }   template <class T>   void _W(const vector<T> &x) {     for (auto i = x.begin(); i != x.end(); _W(*i++))       if (i != x.cbegin()) putchar(   );   }   void W() {}   template <class T, class... U>   void W(const T &head, const U &...tail) {     _W(head);     putchar(sizeof...(tail) ?     :   n );     W(tail...);   }   int MOD = 1e9 + 7;   void ADD(long long &x, long long v) {     x = (x + v) % MOD;     if (x < 0) x += MOD;   }   const int SIZE = 1e6 + 10;   int cnt[101][26];   char an[101];   pair<pair<int, int>, pair<char, char>> e[10000];   int en;   void query(int l, int r) {     W( ? , l, r);     fflush(stdout);     int num = (r - l + 1);     memset((cnt), 0, sizeof((cnt)));     for (int i = (1); i <= (num * (num + 1) / 2); ++i) {       string s;       R(s);       if (((int)(s).size()) <= (num + 1) / 2) {         for (char c : s) {           cnt[((int)(s).size())][c -  a ]++;         }       }     }     int m = (num + 1) / 2;     for (int i = m - 1; i >= 1; i--) {       for (int j = 0; j < (26); ++j) cnt[i + 1][j] -= cnt[i][j];     }     for (int i = 1; i < m; i++) {       for (int j = 0; j < (26); ++j) cnt[i][j] -= cnt[i + 1][j];     }     string ret;     for (int i = (1); i <= (m); ++i) {       for (int j = 0; j < (26); ++j) {         if (cnt[i][j]) {           cnt[i][j]--;           ret +=  a  + j;           break;         }       }     }     for (int i = m; i >= 1; i--) {       for (int j = 0; j < (26); ++j) {         if (cnt[i][j]) {           cnt[i][j]--;           ret +=  a  + j;           break;         }       }     }     int ll = 0, rr = num - 1;     while (ll <= rr) {       if (ll == rr) {         an[l] = ret[ll];       } else {         e[en++] = make_pair(make_pair(l, r), make_pair(ret[ll], ret[rr]));       }       ll++;       rr--;       l++;       r--;     }   }   int main() {     int n;     R(n);     if (n == 1) {       query(1, 1);     } else if (n % 2 == 0) {       query(1, n - 1);       query(n / 2, n - 1);       query(n / 2, n);     } else {       query(1, n);       query(1, n / 2);       query(1, n / 2 + 1);     }     for (int i = 0; i < (1000); ++i) {       for (int j = 0; j < (en); ++j) {         if (an[e[j].first.first]) {           an[e[j].first.second] = (int)e[j].second.second +                                   (int)e[j].second.first - an[e[j].first.first];         }         if (an[e[j].first.second]) {           an[e[j].first.first] = (int)e[j].second.second +                                  (int)e[j].second.first - an[e[j].first.second];         }       }     }     W( ! , string(an + 1));     return 0;   }