#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> ii;
typedef pair<ld,ld> id;
typedef tuple<ll,ll,ll> tl;
typedef tuple<ll,ll,ll,ll> ql;

#define FOR(i, a, b) for(ll i=(a); i<=(b); i++)
#define ROF(i, a, b) for(ll i=(a); i>=(b); i--)
#define MEM(x, v) memset(x, v, sizeof(x))
#define FILL(x, n, v) fill(x, x+n, v);
#define ALL(x) x.begin(), x.end()
#define FAST ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define f first
#define s second
#define ins insert
#define e emplace
#define eb emplace_back
#define ef emplace_front
#define p push
#define pf push_front
#define pb push_back
#define mp make_pair
#define ub upper_bound
#define lb lower_bound
#define ft front
#define bk back
#define pp pop
#define ppb pop_back
#define ppf pop_front

#define db cout<<"YEET\n";
#define ct(x) cout<<x<<'\n';

const ll MOD = 1e9+7; //998244353
const ll MAXN = 10+5;
const ll INF = 1e18;
const ld PI = acos((ld)-1);

string merge(string a, string b, ll pwl){
    ll na = a.length();
    ll nb = b.length();
    string res = "";

    ll pt1 = 0;
    FOR(i,0,na-1){
        string part1 = a.substr(0,i);
        string part2 = a.substr(i,na-i);

        string mid = "";
        while (pt1 < nb){
            mid += b[pt1];

            string query = part1 + mid + part2;
            ll querylength = query.length();

            cout << "? " << query << '\n';
            cout.flush();

            ll ans;
            cin >> ans;

            if (ans == pwl - querylength){
                res += b[pt1];
                pt1++;
            } else break;
        }
        res += a[i];
    }
    while (pt1 < nb){
        res += b[pt1];
        pt1++;
    }

    return res;
}

int main(){
    FAST
    string characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    ll val[62], minn=INF, maxx=-1;
    FOR(i,0,61){
        char ch = characters[i];
        cout << "? " << ch << '\n';
        cout.flush();

        cin >> val[i];
        maxx = max(val[i], maxx);
        minn = min(val[i], minn);
    }

    bool inpw[62];
    ll charcnt[62];
    ll pwlength;

    if (maxx == minn) {
        pwlength = minn+1;
        MEM(inpw, true);

        FOR(i,0,61){
            string query = "";
            FOR(j,1,pwlength){
                query += characters[i];
            }
            cout << "? " << query << '\n';
            cout.flush();

            ll ans;
            cin >> ans;
            charcnt[i] = pwlength-ans;
        }
    } else {
        pwlength = maxx;
        FOR(i,0,61){
            if (val[i] == minn){
                string query = "";
                FOR(j,1,pwlength){
                    query += characters[i];
                }
                cout << "? " << query << '\n';
                cout.flush();

                ll ans;
                cin >> ans;
                charcnt[i] = pwlength - ans;
                inpw[i] = 1;
            } else {
                charcnt[i] = 0;
                inpw[i] = 0;
            }
        }
    }

    queue<string> qq;
    FOR(i,0,61){
        string newstr = "";
        FOR(j,0,charcnt[i]-1){
            newstr += characters[i];
        }
        qq.push(newstr);
    }

    while (qq.size() > 1){
        string aa = qq.front();
        qq.pp();
        string bb = qq.front();
        qq.pp();

        string neww = merge(aa,bb,pwlength);
        qq.push(neww);
    }

    string ans = qq.front();
    cout << "! " << ans << '\n';
    cout.flush();
}

Measured memory_bytes: 3808