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

template <typename A, typename B>string to_string(pair<A, B> p);template <typename A, typename B, typename C>string to_string(tuple<A, B, C> p);template <typename A, typename B, typename C, typename D>string to_string(tuple<A, B, C, D> p);string to_string(const string& s) {  return '"' + s + '"';}string to_string(const char* s) {  return to_string((string) s);}string to_string(bool b) {  return (b ? "true" : "false");}string to_string(vector<bool> v) {  bool first = true;  string res = "{";  for (int i = 0; i < static_cast<int>(v.size()); i++) {    if (!first) {      res += ", ";    }    first = false;    res += to_string(v[i]);  }  res += "}";  return res;}template <size_t N>string to_string(bitset<N> v) {  string res = "";  for (size_t i = 0; i < N; i++) {    res += static_cast<char>('0' + v[i]);  }  return res;}template <typename A>string to_string(A v) {  bool first = true;  string res = "{";  for (const auto &x : v) {    if (!first) {      res += ", ";    }    first = false;    res += to_string(x);  }  res += "}";  return res;}template <typename A, typename B>string to_string(pair<A, B> p) {  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";}template <typename A, typename B, typename C>string to_string(tuple<A, B, C> p) {  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";}template <typename A, typename B, typename C, typename D>string to_string(tuple<A, B, C, D> p) {  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";}void debug_out() { cerr << endl; }template <typename Head, typename... Tail>void debug_out(Head H, Tail... T) {  cerr << " " << to_string(H);  debug_out(T...);}

#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

#define set0(x) memset(x,0,sizeof(x))
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<typename T> void read(T &x){
    x = 0;char ch = getchar();ll f = 1;
    while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
    while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {
    read(first);
    read(args...);
}

int dist(string A,string B){
    static int dp[130][130];
    for(int i=0;i<=A.size();i++){
        for(int j=0;j<=B.size();j++){
            if(!i || !j)dp[i][j] = max(i,j);
            else{
                dp[i][j] = min(dp[i-1][j],dp[i][j-1])+1;
                dp[i][j] = min(dp[i][j],dp[i-1][j-1]+(A[i-1]!=B[j-1]));
            }
        }
    }
    return dp[A.size()][B.size()];
}

int test = 0,Qcnt = 0;
string Ans = "Atcod3rIsGreat";

map<string,int> Mp;
int getans(string cu){
    if(Mp.count(cu))return Mp[cu];
    int cc;
    if(!test){
        cout<<"? "<<cu<<endl;
        cout.flush();
        cin>>cc;
    }else{
    Qcnt+=1;
        cc = dist(cu,Ans);
        //cout<<"Query "<<cu<<" Ans "<<cc<<endl;
    }
    Mp[cu] = cc;
    return cc;
}

string str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int cnt[100] = {0},tlen = 0;

string solve(int l,int r){
    if(l> r)return "";
    if(l == r){
        return cnt[l]?string(cnt[l],str[l]):"";
    }
    string a = solve(l,(l+r)/2);
    string b = solve((l+r)/2+1,r);
    int p = 0;
    for(int i=0;i<b.size();i++){
        while(1){
            string c = a.substr(0,p)+b[i]+a.substr(p,a.size()-p);
            p++;
            if(getans(c) == tlen-c.size()){
                a = c;
                break;
            }
        }
    }
    //cout<<l<<' '<<r<<' '<<a<<endl;
    return a;
}

int main() {
    vector<char> V;
    int mi = 1e9;
    for(int e=0;e<str.size();e++){
        char chr = str[e];
        string cc(128,chr);
        cnt[e] = 128-getans(cc);
        tlen+=cnt[e];
        //if(cnt[e])cout<<cnt[e]<<' '<<str[e]<<endl;
    }
    string A = solve(0,99);
    cout<<"! "<<A<<endl;
    //cout<<Qcnt<<endl;
    return 0;
}


Measured memory_bytes: 3792