#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; random_device rd; vector used(26, false); for (int _ = 0; _ < 25; _++) { // らんたくしましょ。そうしましょ。 int i = 0; while (true) { i = rd() % 26; if (!used[i]) { used[i] = true; break; } } { vector S(N, (char)(i + 'a')); cout << "? "; for (auto c : S) cout << c; cout << endl; } int normal; cin >> normal; if (normal == N) { for (int j = 0; j < N; j++) { found[j] = true; idx[i].push_back(j); } continue; } 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); cout << "? "; for (auto c : S) cout << c; cout << endl; int res; cin >> res; if (res < normal) { 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'); } char unused = 'a'; for (int i = 0; i < 26; i++) if (!used[i]) unused = (char) ('a' + i); for (int i = 0; i < N; i++) if (ans[i] == '_') ans[i] = unused; cout << "! "; for (auto c : ans) cout << c; cout << endl; } int main () { int N; cin >> N; solve(N); }