#include <bits/stdc++.h>
using namespace std;
const int MAXL = 128;
const int Q = 850;
int main() {
ios::sync_with_stdio(0), cin.tie(0);
const string chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789";
assert(chars.size() == 62);
const bool testing = true;
string test_ans;
if (testing) {
mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
//int L = uniform_int_distribution<int>(1, MAXL)(mt);
int L = MAXL-1;
for (int i = 0; i < L; i++) {
test_ans += chars[uniform_int_distribution<int>(0, 61)(mt)];
}
}
int query_cnt = 0;
auto query = [&](string q) -> int {
query_cnt++;
cout << '?' << ' ' << q << '\n' << flush;
int v;
cin >> v;
return v;
};
auto get_cnt = [&](char c) -> int {
if (testing) {
query_cnt++;
int res = 0;
for (char v : test_ans) {
res += v == c;
}
return res;
}
return MAXL - query(string(MAXL, c));
};
vector<int> cnts(62);
int L = 0;
for (int i = 0; i < 62; i++) {
cnts[i] = get_cnt(chars[i]);
L += cnts[i];
}
auto is_subseq = [&](string q) -> int {
assert(int(q.size()) <= L);
if (testing) {
query_cnt++;
int i = 0;
for (char c : test_ans) {
if (c == q[i]) {
i++;
if (i == int(q.size())) return true;
}
}
return false;
} else {
return query(q) == L - int(q.size());
}
};
auto combine = [&](const string& a, const string& b) -> string {
string res;
int ia = 0, ib = 0;
while (ia < int(a.size()) && ib < int(b.size())) {
if (is_subseq(a.substr(0, ia+1) + b.substr(ib))) {
res += a[ia++];
} else {
res += b[ib++];
}
}
while (ia < int(a.size())) res += a[ia++];
while (ib < int(b.size())) res += b[ib++];
return res;
};
function<string(int , int)> solve = [&](int lx, int rx) {
if (lx + 1 == rx) {
return string(cnts[lx], chars[lx]);
} else {
return combine(solve(lx, (lx + rx) / 2), solve((lx + rx) / 2, rx));
}
};
string ans = solve(0, 62);
assert(query_cnt <= Q);
if (testing) {
assert(ans == test_ans);
}
cout << '!' << ' ' << ans << '\n';
}