#include "iostream"
#include "climits"
#include "list"
#include "queue"
#include "stack"
#include "set"
#include "functional"
#include "algorithm"
#include "string"
#include "map"
#include "unordered_map"
#include "unordered_set"
#include "iomanip"
#include "cmath"
#include "random"
#include "bitset"
#include "cstdio"
#include "numeric"
#include "cassert"
#include "ctime"

using namespace std;

constexpr long long int MOD = 1000000007;
//constexpr int MOD = 1000000007;
//constexpr int MOD = 998244353;
//constexpr long long int MOD = 998244353;
constexpr double EPS = 1e-9;

int N, M, K, H, W, L, R;
//long long int N, M, K, H, W, L, R;

int cnt = 0;
string test;

const int DEBUG = 0;

int Ask(string s) {
	cnt++;
	//if (cnt > 900)exit(0);
	if (DEBUG) {
		if (s.size() == 1) {
			if (test.find(s[0]) == test.npos)return test.size();
			else return test.size() - 1;
		}
		else {
			int ret = 0;
			for (int i = 0; i < test.size(); i++) {
				ret += test[i] != s[i];
			}
			return ret;
		}
	}
	cout <<"? "<< s << endl;
	int ret = 0;
	cin >> ret;
	return ret;
}

struct Range {
	int l, r, num;
	Range(const int ll, const int rr, const int nn) {
		l = ll, r = rr, num = nn;
	}
};

class XorShift {
	unsigned int x, y, z, w, t;
public:
	XorShift() {
		x = 133553533;
		y = 314867339;
		z = 664298413;
		w = 999999937;
		t = 0;
	}
	unsigned int rand() {
		t = x ^ (x << 11);
		x = y;
		y = z;
		z = w;
		w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
		return w & 0x7fffffff;
	}
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	if (DEBUG)cin >> test;

	XorShift xs;
	string box;
	for (char i = 'a'; i <= 'z'; i++)box.push_back(i);
	for (char i = 'A'; i <= 'Z'; i++)box.push_back(i);
	for (char i = '0'; i <= '9'; i++)box.push_back(i);
	vector<int>num(256);
	for (auto i : box) {
		string s(128, i);
		num[i] = 128-Ask(s);
	}
	L = accumulate(num.begin(), num.end(),0);
	/*
	int mx = 0, mn = MOD;
	for (auto i : box) {
		mx = max(mx, num[i]);
		mn = min(mn, num[i]);
	}
	if (mx == mn) {
		L = mx + 1;
	}
	else {
		L = mx;
	}
	for (auto i : box) {
		if (num[i] == L) {
			num[i] = 0;
			continue;
		}
		string s(L, i);
		num[i] = L - Ask(s);
	}
	*/
	string ans(L, ' ');
	for (int i = 0; i < 62; i++) {
		for (int j = i + 1; j < 62; j++) {
			if (num[box[i]] < num[box[j]])swap(box[i], box[j]);
		}
	}
	for (int i = 60; i >= 0; i--) {
		swap(box[i], box[i + 1]);
	}
	char dummy = box[0];
	//for (auto i : box)cout << num[i] << endl;
	if (num[box[0]]) {
		vector<int>bag(L);
		int mn = MOD;
		for (int i = 0; i < L; i++) {
			string s;
			if (box[0] == 'a')s.resize(L, 'b');
			else s.resize(L, 'a');
			s[i] = box[0];
			bag[i] = Ask(s);
			mn = min(mn, bag[i]);
		}
		for (int i = 0; i < L; i++) {
			if (mn == bag[i]) {
				ans[i] = box[0];
			}
		}
	}
	for (auto i : box) {
		if (i == dummy)continue;
		queue<Range>Q;
		Q.push(Range(0, L, num[i]));
		while (!Q.empty()) {
			auto cr = Q.front();
			Q.pop();
			if (cr.num == 0)continue;
			if (cr.l >= cr.r)continue;
			int space = 0;
			for (int j = cr.l; j < cr.r; j++) {
				if (ans[j] == ' ')space++;
			}
			if (cr.num == space) {
				for (int j = cr.l; j < cr.r; j++) {
					if (ans[j] == ' ')ans[j] = i;
				}
				//		cout << ans << endl;
				continue;
			}

			int mid = cr.l;
			int lspace = 0;
			for (int j = cr.l; j < cr.r; j++) {
				if (ans[j] == ' ')lspace++;
				if (space / 2 == lspace) {
					mid = j + 1;
					break;
				}
			}
			Range cnxl(cr.l, mid, 0);
			Range cnxr(mid, cr.r, 0);
			string s(L, dummy);
			for (int j = cnxl.l; j < cnxl.r; j++)s[j] = i;
			for (int j = 0; j < L; j++) {
				if (ans[j] != ' ')s[j] = ans[j];
			}
			int lnum = L - Ask(s);
			cnxl.num = lnum;
			for (int j = 0; j < L; j++)cnxl.num -= s[j] == ans[j];
			cnxr.num = cr.num - cnxl.num;
			Q.push(cnxl);
			Q.push(cnxr);
		}
	}
	cout << "! " << ans << endl;
	if (DEBUG)cout << cnt << endl;
}

Measured memory_bytes: 3736