func_code_string: #include <bits/stdc++.h>   inline long long read() {     long long x = 0, f = 1;     char c = getchar();     for (; c >  9  || c <  0 ; c = getchar()) {       if (c ==  - ) f = -1;     }     for (; c >=  0  && c <=  9 ; c = getchar()) {       x = x * 10 + c -  0 ;     }     return x * f;   }   int cnt[27][105];   char s[105], s1[105];   std::string sss, halfans, halfans2;   std::vector<char> ans;   std::map<std::string, int> H1[105], H2[105];   inline char getA(std::string a, std::string b) {     int c[30];     memset(c, 0, sizeof c);     for (int i = 0; i < a.size(); i++) c[a[i] -  a ]++;     for (int i = 0; i < b.size(); i++) c[b[i] -  a ]--;     for (int i = 0; i < 26; i++) {       if (c[i] > 0) return i +  a ;     }     return  a ;   }   inline std::string solve(int n) {     printf( ? 1 %d n , n);     fflush(stdout);     for (int i = 1; i <= n * (n + 1) >> 1; i++) {       scanf( %s , s);       sss = std::string(s);       std::sort(sss.begin(), sss.end());       H1[sss.size()][sss]++;     }     printf( ? 2 %d n , n);     fflush(stdout);     for (int i = 1; i <= n * (n - 1) >> 1; i++) {       scanf( %s , s);       sss = std::string(s);       std::sort(sss.begin(), sss.end());       H2[sss.size()][sss]++;     }     for (int i = 1; i <= n; i++) {       for (auto p : H2[i]) {         H1[i][p.first] -= H2[i][p.first];       }       for (auto p : H1[i]) {         if (p.second > 0) {           std::string new1 = (  );           for (int j = 0; j < ans.size(); j++) new1 += ans[j];           ans.push_back(getA(p.first, new1));         }       }     }     std::string new1 = (  );     for (int j = 0; j < ans.size(); j++) new1 += ans[j];     return new1;   }   inline void work() {     int n = read();     if (n == 1) {       puts( ? 1 1 );       fflush(stdout);       scanf( %s , s);       printf( ! %s n , s);       fflush(stdout);     } else if (n == 2) {       puts( ? 1 1 );       fflush(stdout);       scanf( %s , s);       puts( ? 2 2 );       fflush(stdout);       scanf( %s , s1);       printf( ! %s%s n , s, s1);       fflush(stdout);     } else {       halfans = solve(n + 1 >> 1);       printf( ? 1 %d n , n);       fflush(stdout);       for (int i = 1; i <= n * (n + 1) >> 1; i++) {         scanf( %s , s);         sss = std::string(s);         for (int j = 0; j < sss.size(); j++) {           cnt[sss[j] -  a ][sss.size()]++;         }       }       halfans2 = std::string(  );       for (int i = 1; i <= n >> 1; i++) {         for (int j = 0; j < 26; j++) {           int num = cnt[j][1] - (cnt[j][i + 1] - cnt[j][i]);           for (int k = 0; k < i; k++) {             if (halfans[k] -  a  == j) {               num--;             }           }           for (int k = 0; k < halfans2.size(); k++) {             if (halfans2[k] -  a  == j) {               num--;             }           }           if (num > 0) {             halfans2 += ( a  + j);             break;           }         }       }       for (int i = halfans2.size() - 1; ~i; i--) halfans += halfans2[i];       printf( ! %s n , halfans.c_str());       fflush(stdout);     }   }   int main() {     work();     return 0;   }   