Submission #374802

#TimeUsernameProblemLanguageResultExecution timeMemory
374802Alex_tz307Combo (IOI18_combo)C++17
100 / 100
42 ms552 KiB
#include <bits/stdc++.h> #include "combo.h" using namespace std; string guess_sequence(int N) { string sol; int ok = press("AB"); if(ok) { int first = press("A"); if(first) sol = "A"; else sol = "B"; } else { int first = press("X"); if(first) sol = "X"; else sol = "Y"; } string mask = ""; for(const char &ch : "ABXY") if(ch != sol[0]) mask += ch; if(N == 1) return sol; for(int i = 2; i < N; ++i) { string ask = sol + mask[0] + sol + mask[1] + mask[0] + sol + mask[1] + mask[1] + sol + mask[1] + mask[2]; /// pentru A pe prima pozitie si BXY mask de exemplu /// A nu mai poate sa apara in sir, deci ramanem cu B, X, Y /// daca urmatorul e B, sol + mask[0] va fi raspunsul(de lungime i) si sigur /// nu se obtine lungime mai mare din urmatoarele pentru ca avem X primul caracter adaugat la s /// ramanem cu X si Y /// fixam X, verificam daca se poate obtine X si daca nu se poate obtine X, atunci obtinem Y /// pentru a afla daca X e ok, incercam toate variantele de urmator caracter de dupa X(B, X, Y) /// daca avem X ca raspuns corect, atunci lungimea obtinuta este i + 1 /// nu putem incerca direct pref + X(si sa avem lungime i) pentru ca deja am incercat asta cu B /// si daca ni s-ar returna din functia press valoarea i nu am sti daca avem B sau X /// una din cele mai importante parti ale constructiei, este proprietatea speciala a sirului: /// A nu mai poate sa apara dupa prima pozitie /// astfel, de fiecare data cand adaug la ask s, "resetez" intr-un fel sirul ask /// defapt, prin asta, combin 4 query-uri intr-unul singur int lg = press(ask); if(lg == i) sol += mask[0]; else if(lg == i + 1) sol += mask[1]; else sol += mask[2]; } if(press(sol + mask[0]) == N) return sol + mask[0]; if(press(sol + mask[1]) == N) return sol + mask[1]; return sol + mask[2]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...