#include #include #include #include #include #include using namespace std; using ll = long long; constexpr int iINF = 1'000'000'000; constexpr ll llINF = 1'000'000'000'000'000'000; void solve (int N) { // AAA..Aを送り付ける // BAA..Aを送り付ける // ABA..Aを送り付ける // -> N回でAの場所を特定できる。 // というわけで、A~Yまでを2500回以内で特定できて、ハッピーというわけです。 vector> idx(26); map found; int query = 0; vector normal(26); for (int i = 0; i < 26; i++) { vector S(N, (char)(i + 'a')); query++; assert(query <= 2500); cout << "? "; for (auto c : S) cout << c; cout << endl; cin >> normal[i]; if (normal[i] == N) { for (int j = 0; j < N; j++) { found[j] = true; idx[i].push_back(j); } continue; } } random_device rd; vector ord(25); for (int i = 0; i < 25; i++) ord[i] = i; shuffle(ord.begin(), ord.end(), rd); for (auto i : ord) { for (int j = 0; j < N; j++) { // 回数節約 if (found.find(j) != found.end()) { continue; } vector S(N, (char)(i + 'a')); S[j] = (char) (i + 'a' + 1); query++; assert(query <= 2500); cout << "? "; for (auto c : S) cout << c; cout << endl; int res; cin >> res; if (res < normal[i]) { idx[i].push_back(j); found[j] = true; } } } vector ans(N, '_'); for (int i = 0; i < 26; i++) { for (auto j : idx[i]) ans[j] = (char) (i + 'a'); } for (int i = 0; i < N; i++) if (ans[i] == '_') ans[i] = 'z'; cout << "! "; for (auto c : ans) cout << c; cout << endl; } int main () { int N; cin >> N; solve(N); }