//pragma
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>

#define YOU using
#define DONT namespace
#define SAY std

YOU DONT SAY;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ll,int> pli;
typedef pair<int,ll> pil;
typedef vector<int> vi;
typedef vector<pii> vii;
typedef vector<pll> vll;

#define REPP(i,a,b,d) for(int i=a;i<=b;i+=d)
#define REP(i,a,b) REPP(i,a,b,1)
#define REVV(i,a,b,d) for(int i=a;i>=b;i-=d)
#define REV(i,a,b) REVV(i,a,b,1)

#define FOR(i,a) for(int i=0; i<a; i++)
#define FORD(i,a) for(int i=(int)a-1; i>=0; i--)

#define pb push_back
#define F first
#define S second

const int OO = 1e9;
const ll INF = 1e18;

const int irand(int lo,int hi){
	return ((double)rand()/(RAND_MAX + 1.0)) * (hi-lo+1) + lo;
}

const ll lrand(ll lo,ll hi){
	return ((double)rand()/(RAND_MAX + 1.0)) * (hi-lo+1) + lo;
}

#define getc getchar
template<typename T>
T getnum(){
	int sign = 1;
	T ret = 0;
	char c;

	do{
		c = getc();
	}while(c == ' ' || c == '\n');
	if(c == '-')sign = -1;
	else ret = c-'0';
	while(1){
		c = getc();
		if(c < '0' || c > '9')break;
		ret = 10*ret + c-'0';
	}
	return sign * ret;
}

inline void ini(int& x){
	x = getnum<int>();
}

inline void scani(int& x){
	scanf("%d",&x);
}

//end of macro

const int L = 128;

string target = "Atcod3rIsGreat";

string sa, sb;
int memo[128][128];
int dp(int i, int j){
	if(i == sa.size())return sb.size()-j;
	if(j == sb.size())return sa.size()-i;
	int& ret = memo[i][j];
	if(ret != -1)return ret;

	if(sa[i] == sb[j]){
		ret = dp(i+1, j+1);
	}else{
		ret = OO;
		// delete i
		ret = min(ret, dp(i+1, j) + 1);
		// insert i
		ret = min(ret, dp(i, j+1) + 1);
		// replace
		ret = min(ret, dp(i+1, j+1) + 1);
	}
	return ret;
}

int edit_distance(string a, string b){
	sa = a;
	sb = b;
	memset(memo, -1, sizeof memo);
	return dp(0, 0);
}

int ask(string str){
	cout << "? " << str << endl;
	int ret;
	cin>>ret;
	// ret = edit_distance(str, target);
	return ret;
}

char c[62];
int cnt[62];
void get_cnt(){
	FOR(i,62){
		string str;
		FOR(j,L)str += c[i];
		cnt[i] = 128 - ask(str);
		// printf("cnt %c = %d\n",c[i],cnt[i]);
	}
}

int l;
priority_queue<pair<int,string> >pq;

string merge_s(string a, string b){
	int i = 0, j = 0;
	string ret;
	while(i < a.size() && j < b.size()){
		// b[j] goes first?
		string tmp = ret;
		tmp += b[j];
		for(int k=i; k<a.size(); k++)
			tmp += a[k];

		if(ask(tmp) == l-tmp.size()){ // tmp is a subseq of S
			ret += b[j++];
		}else{
			ret += a[i++];
		}
	}
	while(i < a.size())ret += a[i++];
	while(j < b.size())ret += b[j++];
	return ret;
}

int main(){
    // ios_base::sync_with_stdio(0);
    // cin.tie(0);
    // cout.tie(0);
    // #define endl '\n'
    // cout.setf(ios::fixed);
    // cout.setf(ios::showpoint);
    // cout.precision(10);

	FOR(i,26)c[i] = 'a'+i;
	FOR(i,26)c[26+i] = 'A'+i;
	FOR(i,10)c[52+i] = '0'+i;

	get_cnt();

	FOR(i,62){
		if(cnt[i]){
			string str;
			FOR(j,cnt[i])str += c[i];
			pq.push({-cnt[i], str});
			l += cnt[i];
		}
	}

	while(pq.size() > 1){
		string a = pq.top().S;
		pq.pop();
		string b = pq.top().S;
		pq.pop();

		string ab = merge_s(a, b);
		// printf("merge %s %s = %s\n",a.c_str(), b.c_str(), ab.c_str());
		pq.push({-ab.size(), ab});
	}

	cout << "! " << pq.top().S << endl;

    return 0;
}


Measured memory_bytes: 3764