#include #include using namespace std; int N, D; //delka celeho prijateho retezce a delka retezce, ktery chceme ziskat string vstup; //prijaty retezec (pro kazde volani 'vyres' budou N, D a vstup jine) //funkce, ktera overi, zda na a-tem indexu mohla zacinat puvodni zprava bool mohloNastat(int a, int b) { bool neshoda = false; //uz jsme narazili na prvni neshodu? for (int i = 0; i < D; i++) { if (vstup[a] != vstup[b]) { if (neshoda) return false; //jde už o druhou neshodu neshoda = true; b++; continue; } a++; b++; } //ke dvema neshodam nedoslo, na a-tem indexu tak mohla zacinat puvodni zprava return true; } //samotna metoda pro zpracovani zpravy: void vyres() { cin >> N >> vstup; if (N % 2 == 0) { //sudy pocet znaku cout << "[chyba]" << endl; return; } D = N/2; //zvlast vyzkousej obe moznosti: bool moznost1 = mohloNastat(0, D); bool moznost2 = mohloNastat(D+1, 0); if (!moznost1 && !moznost2) //ani jedna moznost nenastala cout << "[chyba]" << endl; else if (!moznost2) //zprava je v prvnich D znacich cout << vstup.substr(0, D) << endl; else if (!moznost1) //zprava je v poslednich D znacich cout << vstup.substr(D+1, D); else { //obe moznosti mohly nastat if (vstup.substr(0, D) == vstup.substr(D+1, D)) cout << vstup.substr(0, D) << endl; else cout << "[neunikatni]" << endl; } } int main() { int pocetZprav; cin >> pocetZprav; for (int i = 0; i < pocetZprav; i++) { vyres(); //zpravy se vzajemne neovlivnuji, a tak algoritmus pouzijeme pro kazdou zvlast } return 0; }