//~ while (clock()<=69*CLOCKS_PER_SEC)
//~ #pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
//~ #pragma GCC target ("avx2")
//~ #pragma GCC optimize("Ofast")
//~ #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//~ #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "

#define shandom_ruffle random_shuffle

using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using vi=vector<int>;
using vll=vector<ll>;
const int nax=1000*1007;

void ff()
{
	fflush(stdout);
}

//~ vector<char> ukr={'A', 't', 'c', 'o', 'd', '3', 'r', 'I', 's', 'G', 'r', 'e', 'a', 't'};
//~ vector<char> ukr={'a', 'a', 'b', 'a', 'b'};
//~ vector<char> ukr={'9'};

int edi(vector<char> a, vector<char> b)
{
	int as=a.size();
	int bs=b.size();
	vector<vi> dp(as+1, vi(bs+1, 0));
	for (int i=0; i<=as; i++)
	{
		for (int j=0; j<=bs; j++)
		{
			if (!i && !j)
				continue;
			if (!i || !j)
			{
				dp[i][j]=i+j;
				continue;
			}
			if (a[i-1]==b[j-1])
				dp[i][j]=min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])+1);
			else
				dp[i][j]=min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))+1;
		}
	}
	
	return dp[as][bs];
}

int pyt(vector<char> wek)
{
	printf("? ");
	for (char i : wek)
		printf("%c", i);
	printf("\n");
	ff();
	//~ return edi(wek, ukr);
	int x;
	scanf("%d", &x);
	return x;
}

void ans(vector<char> wek)
{
	printf("! ");
	for (char i : wek)
		printf("%c", i);
	printf("\n");
	ff();
	exit(0);
}

vector<char> zna;

int n;

map<char,int> mapa;

bool mniej(const vector<char> &a, const vector<char> &b)
{
	return (int)a.size()>(int)b.size();
}

vector<char> lacz(vector<char> a, vector<char> b)
{
	for (int i=(int)a.size(); i>=0; i--)
	{
		while(!b.empty())
		{
			auto now=a;
			now.insert(now.begin()+i, b.back());
			if (!i || pyt(now)==n-(int)now.size())
			{
				a=now;
				b.pop_back();
			}
			else
			{
				break;
			}
		}
	}
	return a;
}

int main()
{
	for (char i='a'; i<='z'; i++)
		zna.push_back(i);
	for (char i='A'; i<='Z'; i++)
		zna.push_back(i);
	for (char i='0'; i<='9'; i++)
		zna.push_back(i);
	vector<pair<int,char>>wek;
	for (char i : zna)
		wek.push_back({pyt({i}), i});
	sort(wek.begin(), wek.end());
	for (int i=0; i<(int)wek.size(); i++)
		if (wek[i].first==wek[0].first)
			mapa[wek[i].second]=1;
	n=wek[0].first+1;
	debug() << imie(n);
	int brak=n-mapa.size();
	debug() << imie(brak);
	for (int i=2; i<=n; i++)
	{
		for (auto j : mapa)
		{
			if (j.second==i-1 && brak)
			{
				vector<char> daj;
				for (int l=1; l<=i; l++)
					daj.push_back(j.first);
				if (pyt(daj)==n-i)
				{
					brak--;
					mapa[j.first]++;
				}
				//~ brak--;
			}
		}
	}
	vector<vector<char>> wsz;
	for (auto i : mapa)
		if (i.second)
		{
			vector<char> daj;
			for (int l=1; l<=i.second; l++)
				daj.push_back(i.first);
			wsz.push_back(daj);
		}
	while((int)wsz.size()>1)
	{
		sort(wsz.begin(), wsz.end(), mniej);
		auto a=wsz.back();
		wsz.pop_back();
		auto b=wsz.back();
		wsz.pop_back();
		wsz.push_back(lacz(a, b));
	}
	ans(wsz[0]);
	return 0;
}


Measured memory_bytes: 3776