#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
typedef long long ll;
typedef pair<string,int> psi;
const int MAXC = 62 + 5;
const int maxl = 128;

//#define LOCAL
//#define DEBUG

struct Test
{
	string ans;
	int tot;
	
	Test(void)
	{	
		srand(time(0));
		for(int i=0; i<maxl; ++i)
		{
			if(i>0 && rand()%4==0)
			{
				ans.push_back(ans[i-1]);
			}
			else
			{
				int x = rand() % 62;
				if(x < 26) ans.push_back(x + 'a');
				else if(x-26 < 26) ans.push_back(x-26 + 'A');
				else ans.push_back(x-26-26 + '0');
			}
		}
		tot=0;
		
		//ans = "aba";
		
		cout << "Answer is " << ans << "\n\n";
	}
	
	inline int ask(const string &s)
	{
		cout << "Ask: \"" << s << "\"\n\n";
		
		++tot;
		if(tot > 850) printf("Too many queries\n"), exit(0);
		
		if(s.size() > maxl) cout << "Password too long:\n" << s.size(), exit(0);
		
		for(int i=0; i<(int)s.size(); ++i)
		{
			if((s[i]>='A' && s[i]<='Z') || (s[i]>='a' && s[i]<='z') || (s[i]>='0' && s[i]<='9'));
			else cout << "Wrong password:\n" << s, exit(0);
		}
		
		static int f[maxl+1][maxl+1];
		int n = ans.size(), m = s.size();
		
		for(int i=1; i<=n; ++i) f[i][0] = i;
		for(int i=1; i<=m; ++i) f[0][i] = i;
		
		for(int i=1; i<=n; ++i)
			for(int j=1; j<=m; ++j)
			{
				if(ans[i-1] == s[j-1]) f[i][j] = f[i-1][j-1];
				else f[i][j] = min(f[i-1][j-1], min(f[i-1][j], f[i][j-1])) + 1;
			}
		
		cout << "Result: " << f[n][m] << "\n\n";
		return f[n][m];
	}
	
	inline void answer(const string &s)
	{
		if(s == ans) cout << "OK answer is: \n\t" << ans << "\nfind: \n\t" << s;
		else cout << "Wrong answer find \"" << s << "\" expect \"" << ans << "\"\n";
	}
};

#ifdef LOCAL

Test io;
inline int ask(const string &s){ return io.ask(s);}
inline void answer(const string &s){ io.answer(s);}

#else

inline int ask(const string &s)
{
	cout<<"? "<<s<<endl;
	fflush(stdout);
	int res;
	scanf("%d",&res);
	return res;
}

inline void answer(const string &s)
{
	cout<<"! "<<s<<endl;
	fflush(stdout);
}

#endif

psi solve(const psi &s,const psi &tt)
{
#ifdef DEBUG
	static bool a[1000];
	memset(a,0,sizeof(a));
	
	for(int i=0; i<(int)s.first.size(); ++i)
		a[(int)s.first[i]] = 1;
	for(int i=0; i<(int)tt.first.size(); ++i)
		a[(int)tt.first[i]] = 1;
	
	string ans;
	
	for(int i=0; i<(int)io.ans.size(); ++i)
		if(a[(int)io.ans[i]])
			ans += io.ans[i];
	
	cout << "------------------------\nin: \n" << s.first << "\n" << tt.first << "\n\n" << "ans: \n" << ans << "\n\n";
#endif
	
	psi res = s;
	int now = 0;
	string &ress = res.first;
	
	const string &t = tt.first;
	for(int i=0; i<(int)t.size();)
	{
		if(now >= (int)ress.size())
		{
			ress += t.substr(i, t.size()-i);
			res.second = ask(ress);
			break;
		}
		
		string tmp = ress.substr(0,now) + t[i] + ress.substr(now,ress.size()-now);
		int val = ask(tmp);
		
		if(val < res.second) res = make_pair(tmp, val), ++i;
		++now;
	}

#ifdef DEBUG	
	cout << "res: \n" << res.first << "\n\n";
	cout << "ans: \n" << ans << "\n\n";
#endif
	
	return res;
}

vector<psi> s;

int main(void)
{
	int n = 0;
	for(int i='a'; i<='z'; ++i)
	{
		string t(maxl,i);
		int res = maxl - ask(t);
		if(res) s.push_back(make_pair(string(res, i), 0)), n += res;
	}
	for(int i='A'; i<='Z'; ++i)
	{
		string t(maxl,i);
		int res = maxl - ask(t);
		if(res) s.push_back(make_pair(string(res, i), 0)), n += res;
	}
	for(int i='0'; i<='9'; ++i)
	{
		string t(maxl,i);
		int res = maxl - ask(t);
		if(res) s.push_back(make_pair(string(res, i), 0)), n += res;
	}
	
	for(int i=0; i<(int)s.size(); ++i)
		s[i].second = n - s[i].first.size();
	
	while((int)s.size() > 1)
	{
		vector<psi> t;
		
		for(int i=0; i+1<(int)s.size(); i+=2)
			t.push_back(solve(s[i], s[i+1]));
		if(s.size()%2) t.push_back(s.back());
		
		s=t;
	}
	answer(s[0].first);
	return 0;
}

Measured memory_bytes: 3804