#include <bits/stdc++.h>
 
// headers {{{
using namespace std;
// using namespace rel_ops;
 
typedef long long int64;
typedef unsigned long long uint64;
const double pi=acos(-1.0);
const double eps=1e-11;
const int inf=0x7FFFFFFF;
template<class T> inline bool checkmin(T &a,T b){return b<a?a=b,1:0;}
template<class T> inline bool checkmax(T &a,T b){return b>a?a=b,1:0;}
template<class T> inline T sqr(T x){return x*x;}
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VII;
#define MP(A,B) make_pair(A,B)
#define PB(X) push_back(X)
#define mem(a,b) memset(a, b, sizeof(a))
#define clr(a) memset(a, 0, sizeof(a))
#define rep(i,n) for(int i=0; i<(int)n; i++)
#define repit(i,v) for(typeof(v.begin()) i=v.begin(); i!=v.end(); i++)
#define iter(v) typeof(v.begin())
#define ff first
#define ss second
#ifdef LOCAL
#define dbg(args...) printf(args); //##__VA_ARGS__
#define dout cout
#define out(x) (cout<<#x<<": "<<x<<endl)
template<class T>void show(T a, int n){for(int i=0; i<n; ++i) cout<<a[i]<<' '; cout<<endl;}
template<class T>void show(T a, int r, int l){for(int i=0; i<r; ++i)show(a[i],l);cout<<endl;}
#else
#define dbg(...)
#define dout if(true);else cout
#define out(...)
#define show(...)
#endif
// }}}

int real_query(const string& s) {
    cout << "? " << s << endl;
    int len; cin >> len;
    return len;
}
int dp[200][200];
string pwd;
int fake_query(const string& s) {
    rep(i, pwd.length()) dp[i+1][0] = i+1;
    rep(j, s.length()) dp[0][j+1] = j+1;
    rep(i, pwd.length()) rep(j, s.length()) {
        int& d = dp[i+1][j+1];
        if (pwd[i] == s[j]) d = dp[i][j];
        else d = min(dp[i][j], min(dp[i][j+1], dp[i+1][j]))+1;
    }
    // show(dp, pwd.length(), s.length());
    return dp[pwd.length()][s.length()];
}
int cnt=0;
int query(const string& s) {
    cnt++;
    // out(s); out(pwd);
    // return fake_query(s);
    // return ret;
    return real_query(s);
}
int main() {
    // int T; cin >> T; rep(cas, T)
    out("here");
    vector<string> v;
    vector<char> chv;
    for (char ch = 'a'; ch <='z'; ch++) chv.PB(ch);
    for (char ch = 'A'; ch <='Z'; ch++) chv.PB(ch);
    for (char ch = '0'; ch <='9'; ch++) chv.PB(ch);
    pwd.resize(128);
    srand(time(0));
    rep(i, 128) pwd[i] = chv[rand() % 3 % chv.size()];
    out(pwd);
    priority_queue<pair<int, string>> q;
    int total_len = 0;
    for (auto ch:chv) {
        string s(128, ch);
        int len = query(s);
        // v.emplace_back(len, ch);
        len = 128 - len;
        total_len += len;
        if (len>0) q.emplace(MP(-len, string(len,ch)));
    }
    while (!q.empty()) {
        auto a = q.top(); q.pop();
        if (q.empty()) {
            dout << "chk " << fake_query(a.second) << endl;
            cout << "! " << a.second << endl;
            break;
        }
        auto b = q.top(); q.pop();
        auto sa = a.second, sb = b.second;
        int i = 0, j = 0;
        int cntb = cnt, la = sa.length(), lb = sb.length();
        while (i < (int)sa.length() && j < (int)sb.length()) {
            auto tmp = sa;
            tmp.insert(tmp.begin()+i, sb[j]);
            int len = query(tmp);
            if (len + (int)tmp.length() == total_len) {
                sa = tmp; i++; j++;
            } else {
                i++;
            }
        }
        while (j<(int)sb.length()) sa += sb[j++];
        int cnta = cnt;
        dout << la << ' ' << lb <<' '<<sa.length() << ' ' << cnta-cntb << endl;
        q.emplace(MP(-int(sa.length()), sa));
    }
    out(cnt);
    return 0;
}



Measured memory_bytes: 3768