#include <bits/stdc++.h>

using namespace std;

typedef double D;
typedef long long int LL;

#define st first
#define nd second
#define PLL pair <LL, LL>
#define PII pair <int, int>

const int L = 128;

vector <char> letters;

namespace local{
	bool _init = false;
	string password;	
	int dp[L + 1][L + 1];
	
	void init(){
		while(password.size() < L)
			password.push_back(letters[rand() % 62]);
		return;

		for(auto c: letters){
			password.push_back(c);
			password.push_back(c);
		}
		
		while(password.size() < 100)
			password.push_back('a');
		random_shuffle(password.begin(), password.end());
		cerr << password << "\n";
	}
	
	void calc_dp(string &s){
		int n = password.size(), m = s.size();
		for(int i = 1; i <= m; ++i)
			dp[0][i] = i;
		for(int i = 1; i <= n; ++i)
			dp[i][0] = i;
		
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= m; ++j){
				auto cp = password[i - 1], cs = s[j - 1];
				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] + 1);

				if(cp == cs)
					dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
			}
	}
	
	int ask(string s){
		if(!_init)
			init();
		_init = true;
		
		calc_dp(s);
		return dp[password.size()][s.size()];
	}
}

int queries = 0;
int ask(string s){
	++queries;

	static const bool LOCAL = false;
	if(LOCAL)
		return local::ask(s);

	cout << "? " << s << "\n";
	fflush(stdout);
	
	int t;
	cin >> t;
	return t;
}

int len;
vector <string> substrs;

void get_len(){
	int s = 1, e = L;
	while(s < e){
		int mid = (s + e) / 2;
		string cur;
		
		for(int i = 0; i < mid; ++i)
			cur.push_back('a');
		
		int fa = ask(cur);
		cur.push_back('a');
		
		if(fa < ask(cur))
			e = mid;
		else
			s = mid + 1;
	}
	
	len = s;
}

void get(char c){
	string ret;
	while((int)ret.size() < len)
		ret.push_back(c);
	
	int l = len - ask(ret);
	while((int)ret.size() > l)
		ret.pop_back();
	
	if(ret.size())
		substrs.push_back(ret);
}

int count(string a, string b, string ret, int it){
	reverse(ret.begin(), ret.end());
	string st;
	for(int i = 0; i < it; ++i)
		st.push_back(a[i]);
	
	int t = 1;
	while(t <= (int)b.size()){
		string tmp = st;
		for(int i = b.size() - t; i < (int)b.size(); ++i)
			tmp.push_back(b[i]);
		
		tmp += ret;
		if(len - ask(tmp) < (int)tmp.size())
			break;
		t *= 2;
	}
	
	int s = t / 2, e = min(t - 1, (int)b.size());
	while(s < e){
		t = (s + e + 1) / 2;
		string tmp = st;
		for(int i = b.size() - t; i < (int)b.size(); ++i)
			tmp.push_back(b[i]);
		
		tmp += ret;
		if(len - ask(tmp) < (int)tmp.size())
			e = t - 1;
		else
			s = t;
	}
	
	return s;
}

string Union(string a, string b){
	string ret;
//	cerr << "Union " << a << " " << b << "\n";

	int it = a.size();
	while(it > 0){
		int l = count(a, b, ret, it);
		while(l--){
			ret.push_back(b.back());
			b.pop_back();
		}

		ret.push_back(a[--it]);
	}
	
	while(b.size()){
		ret.push_back(b.back());
		b.pop_back();
	}
	
	reverse(ret.begin(), ret.end());
	return ret;
}

int main(){
	ios_base::sync_with_stdio(false);

	for(int i = 'a'; i <= 'z'; ++i)
		letters.push_back(i);
	for(int i = 'A'; i <= 'Z'; ++i)
		letters.push_back(i);	
	for(int i = '0'; i <= '9'; ++i)
		letters.push_back(i);
	
	get_len();
	for(auto c: letters)
		get(c);
	
	while(substrs.size() > 1){
		sort(substrs.begin(), substrs.end(), [](string a, string b){
			if(a.size() != b.size())
				return a.size() > b.size();
			return a < b;
		});
		
		string fa = substrs.back();
		substrs.pop_back();
		
		string fb = substrs.back();
		substrs.pop_back();		
		substrs.push_back(Union(fa, fb));
	}
	
	string ans = substrs[0];
	if(ans != local::password)
		cerr << "WA\n";

	cout << "! " << ans << "\n";
	fflush(stdout);
	cerr << "queries = " << queries << "\n";
	return 0;
}

Measured memory_bytes: 3796