#include <bits/stdc++.h>   using namespace std;   int n;   char s[105];   string S;   multiset<string> st;   vector<string> v;   inline bool cmp(string a, string b) { return a.length() < b.length(); }   int cnt[26];   char ans[105];   int f[105][26];   int main() {     scanf( %d , &n);     if (n <= 3) {       if (n == 1) {         printf( ? 1 1 n ), fflush(stdout);         scanf( %s , s);         printf( ! %s n , s);         return 0;       }       printf( ? 2 %d n , n), fflush(stdout);       for (int i = 1; i <= n * (n - 1) / 2; i++) {         scanf( %s , s);         S = s;         sort(S.begin(), S.end());         st.insert(S);       }       printf( ? 1 %d n , n), fflush(stdout);       for (int i = 1; i <= n * (n + 1) / 2; i++) {         scanf( %s , s);         S = s;         sort(S.begin(), S.end());         if (st.find(S) == st.end())           v.push_back(S);         else           st.erase(st.find(S));       }       sort(v.begin(), v.end(), cmp);       printf( !  );       for (int i = 0; i < n; i++) {         if (i == 0) {           printf( %c , v[i][0]);           continue;         }         for (int j = 0; j < i + 1; j++) cnt[v[i][j] -  a ]++;         for (int j = 0; j < i; j++) cnt[v[i - 1][j] -  a ]--;         for (int j = 0; j < 26; j++) {           if (cnt[j]) {             cnt[j] = 0, printf( %c , j +  a );             break;           }         }       }       puts(  );       return 0;     }     int m = (n + 1) / 2;     printf( ? 2 %d n , m), fflush(stdout);     for (int i = 1; i <= m * (m - 1) / 2; i++) {       scanf( %s , s);       S = s;       sort(S.begin(), S.end());       st.insert(S);     }     printf( ? 1 %d n , m), fflush(stdout);     for (int i = 1; i <= m * (m + 1) / 2; i++) {       scanf( %s , s);       S = s;       sort(S.begin(), S.end());       if (st.find(S) == st.end())         v.push_back(S);       else         st.erase(st.find(S));     }     sort(v.begin(), v.end(), cmp);     for (int i = 0; i < m; i++) {       if (i == 0) {         ans[i + 1] = v[i][0];         continue;       }       for (int j = 0; j < i + 1; j++) cnt[v[i][j] -  a ]++;       for (int j = 0; j < i; j++) cnt[v[i - 1][j] -  a ]--;       for (int j = 0; j < 26; j++) {         if (cnt[j]) {           cnt[j] = 0, ans[i + 1] = j +  a ;           break;         }       }     }     printf( ? 1 %d n , n), fflush(stdout);     for (int i = 1; i <= n * (n + 1) / 2; i++) {       scanf( %s , s);       int len = strlen(s);       for (int j = 0; j < len; j++) {         f[len][s[j] -  a ]++;       }     }     for (int i = m; i; i--) {       for (int j = 0; j < 26; j++) {         int x = f[i][j] - f[i - 1][j];         for (int k = i; k < n + 1 - i; k++) x -= ans[k] == j +  a ;         if (x) {           ans[n + 1 - i] = j +  a ;           break;         }       }     }     printf( !  );     for (int i = 1; i <= n; i++) printf( %c , ans[i]);     puts(  );   }   