#define _CRT_SECURE_NO_WARNINGS
#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<iomanip>
#include<assert.h>
#include<unordered_map>
#include<unordered_set>
#include<string>
#include<stack>
#include<complex>
#include<memory>
#include<numeric>
/*
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")*/
    
using namespace std;
    
using ll=long long;
using ld =long double;
    
#define WHATS(var)//cout<<__LINE__<<' '<<#var<<"="<<var<<endl;
    
template<class S, class T> ostream& operator <<(ostream &os, const pair<S, T> v){
    os << "( " << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator <<(ostream &os, const vector<T> &v){
    for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator <<(ostream &os, const vector<vector<T>> &v){
    for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}
template<class T> ostream& operator <<(ostream &os, const vector<set<T>> &v){
    for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}
template<class T> ostream& operator <<(ostream &os, const set<T> &v){
    int i=0;
    for(auto it:v){
        if(i > 0){os << ' ';}
        os << it;
        i++;
    } 
    return os;
}
using Graph=vector<vector<int>>;
 
 
const int mod = 998244353;



bool operator<(const vector<int>&lv,const vector<int>&rv){
    
    if(lv.size()!=rv.size()){
        return lv.size()<rv.size();
    }else{
        for(int i=0;i<lv.size();++i){
            if(lv[i]!=rv[i]){
                return lv[i]<rv[i];
            }
        }
        return false;
    }
}

ll gcd(ll a,ll b){
    if(a%b==0)return b;
    else{
        return gcd(b,a%b);
    }
}

int gettp(int x,int y,int cx,int cy){
    return int (x>=cx) + int(y>=cy)*2;
}

string to(vector<int>v){
    string st;
    for(auto x:v){
        char ch;
        if(x<26)ch='a'+x;
        else if(x<52)ch='A'+(x-26);
        else ch='0'+(x-52);
        st.push_back(ch);
    }
    return st;
}
string real_answer="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcd";
int oooo=0;
int say(vector <int>v,bool flag=false,bool autosay=false){
    string st=to(v);
    if(flag){
        cout<<"! "<<st<<endl;
        return -1;
    }
    oooo++;
    cout<<"? "<<st<<endl;
    if(autosay&&v.size()==real_answer.size()){
        int sum=0;
        for(int i=0;i<real_answer.size();++i){
            if(real_answer[i]!=st[i])sum++;
        }
        cout<<sum<<endl;
        return sum;
    }
    int ans;
    cin>>ans;
    return ans;
}
const int SIX_TWO=62;

vector<int>fin_answer;
int len;
int all_a_cnt;
void dfs(int l,int r,map<int,int>mp,vector<int>&pluss){
    if(mp.size()==1){
        for(int x=l;x<r;++x){
            fin_answer[x]=mp.begin()->first;
        }
        for(auto m:mp){
            if(m.first)pluss[m.first]+=r-l;
            else{
                for(int i=1;i<pluss.size();++i){
                    pluss[i]-=r-l;
                }
            }
        }
        return;
    }
    WHATS(l)
    WHATS(r)
    for(auto m:mp){
        WHATS(m)
    }
    assert(l+2<=r);
    int mid=(l+r)/2;
    map<int,int>now_pluss;
    int plus_sum=0;
    now_pluss[0]=0;
    if(mp.find(0)==mp.end()){

    }
    for(auto it=mp.begin();it!=mp.end();++it){

        auto m=*it;
        if(next(it)==mp.end()&&mp.find(0)==mp.end()){
            now_pluss[it->first]=(r-mid)-plus_sum;
            plus_sum=(r-mid);
            continue;
        }
        if(m.first!=0){
            vector<int>v(l,0);
            for(int i=0;i<mid-l;++i){
                v.push_back(0);
            }
            for(int i=0;i<len-mid;++i){
                v.push_back(m.first);
            }
            int ans=len-say(v);
            now_pluss[m.first]=ans-all_a_cnt-pluss[m.first];
            plus_sum+=ans-all_a_cnt-pluss[m.first];
        }else{
            
        }
    }
    int amari=r-mid-plus_sum;
    WHATS(plus_sum)
    WHATS(pluss)
    WHATS(amari)
    assert((amari)%int(mp.size())==0);

    map<int,int>l_mp,r_mp;
    for(auto m:mp){
        int r_cnt=now_pluss[m.first]+amari/int(mp.size());
        int l_cnt=m.second-r_cnt;
        if(r_cnt)r_mp[m.first]=r_cnt;
        if(l_cnt)l_mp[m.first]=l_cnt;

        WHATS(m.first)
        WHATS(r_cnt)
        WHATS(l_cnt)
    }
    dfs(mid,r,r_mp,pluss);

    dfs(l,mid,l_mp,pluss);

}
int main() {
    ios::sync_with_stdio(false);
    cin.tie();
    int k=say(vector<int>{0});
    len=k;
    {
        int kk=say(vector<int>(128,0));

        if(kk!=128){
            len++;
        }
    }
    fin_answer=vector<int>(len,-1);
    map<int,int>mp;
    for(int i=0;i<SIX_TWO;++i){
        int kkk=len-say(vector<int>(len,i));
        if(kkk)mp[i]=kkk;
    }
    all_a_cnt=len-say(vector<int>(len,0));
    vector<int>pluss(SIX_TWO);
    dfs(0,len,mp,pluss);

    say(fin_answer,true);
    WHATS(oooo)

    
    return 0;
}

Measured memory_bytes: 3796