#include <iostream> #include <string> #include <cstdio> using namespace std; int main() { unsigned long ile = 0; // 4 B // od 0 do 4'294'967'295 long i = 0; // 4 B unsigned long polowa = 0; // 4B char znak; // 1 B char c; // 1 B unsigned long long skompresowane = 0; // 8 B char stopienKompresji = 13; // 1 B unsigned long long potegi[stopienKompresji]; // 112 B potegi[0] = 1; for(i = 1; i < stopienKompresji; i++) *(potegi + i) = 26 * *(potegi + i - 1); cin >> ile; if(ile != 0) { // wiemy, ile znaków if(ile <= 7800001) { polowa = ile / 2; char *tablica = new char[polowa]; // 3 900 000 B for(i = 0; i < polowa; i++) { cin >> *(tablica + i); } if(ile % 2 == 1) // porzuć środkowy, gdy nieparzysta długość, bo nie ma znaczenia cin >> znak; for(i = polowa - 1; i > 0; i--) { cin >> znak; if(znak != *(tablica + i)) { cout << "NIE"; return 0; } } cout << "TAK"; return 0; } else { // z kompresją polowa = ile / (stopienKompresji * 2) ; // 14 * 2 -- połowa grup kompresowanych unsigned long long *tablicaSkompresowana = new unsigned long long[polowa]; for(i = 0; i < polowa; i++) { skompresowane = 0; for(c = 0; c < stopienKompresji; c++) { cin >> znak; znak -= 'a'; skompresowane += znak * *(potegi + c); } *(tablicaSkompresowana + i) = skompresowane; } char *srodek = new char [stopienKompresji * 2 - 1]; // grupa środkowa max 27 znaków (< 2 * 13) i = 0; for(c = polowa * stopienKompresji; c < ile / 2; c++) { cin >> *(srodek + i); i++; } if(ile % 2 == 1) // porzuć środkowy, gdy nieparzysta długość, bo nie ma znaczenia cin >> znak; i--; for(; i >= 0; i--) { cin >> znak; if(znak != *(srodek + i)) { cout << "NIE"; return 0; } } // porównaj skompresowane for(i = polowa - 1; i >= 0; i--) { skompresowane = 0; for(c = stopienKompresji - 1; c >= 0; c--) { cin >> znak; znak -= 'a'; skompresowane += znak * *(potegi + c); } if(skompresowane != *(tablicaSkompresowana + i)) { cout << "NIE"; return 0; } } cout << "TAK"; return 0; } } else { // nie wiemy, ile znaków :-( string input; cin >> input; ile = input.length(); polowa = ile / 2; for(i = 0; i < polowa; i++) { if(input[i] != input[ile - i - 1]) { cout << "NIE"; return 0; } } cout << "TAK"; return 0; } cout << "NIE"; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <iostream> #include <string> #include <cstdio> using namespace std; int main() { unsigned long ile = 0; // 4 B // od 0 do 4'294'967'295 long i = 0; // 4 B unsigned long polowa = 0; // 4B char znak; // 1 B char c; // 1 B unsigned long long skompresowane = 0; // 8 B char stopienKompresji = 13; // 1 B unsigned long long potegi[stopienKompresji]; // 112 B potegi[0] = 1; for(i = 1; i < stopienKompresji; i++) *(potegi + i) = 26 * *(potegi + i - 1); cin >> ile; if(ile != 0) { // wiemy, ile znaków if(ile <= 7800001) { polowa = ile / 2; char *tablica = new char[polowa]; // 3 900 000 B for(i = 0; i < polowa; i++) { cin >> *(tablica + i); } if(ile % 2 == 1) // porzuć środkowy, gdy nieparzysta długość, bo nie ma znaczenia cin >> znak; for(i = polowa - 1; i > 0; i--) { cin >> znak; if(znak != *(tablica + i)) { cout << "NIE"; return 0; } } cout << "TAK"; return 0; } else { // z kompresją polowa = ile / (stopienKompresji * 2) ; // 14 * 2 -- połowa grup kompresowanych unsigned long long *tablicaSkompresowana = new unsigned long long[polowa]; for(i = 0; i < polowa; i++) { skompresowane = 0; for(c = 0; c < stopienKompresji; c++) { cin >> znak; znak -= 'a'; skompresowane += znak * *(potegi + c); } *(tablicaSkompresowana + i) = skompresowane; } char *srodek = new char [stopienKompresji * 2 - 1]; // grupa środkowa max 27 znaków (< 2 * 13) i = 0; for(c = polowa * stopienKompresji; c < ile / 2; c++) { cin >> *(srodek + i); i++; } if(ile % 2 == 1) // porzuć środkowy, gdy nieparzysta długość, bo nie ma znaczenia cin >> znak; i--; for(; i >= 0; i--) { cin >> znak; if(znak != *(srodek + i)) { cout << "NIE"; return 0; } } // porównaj skompresowane for(i = polowa - 1; i >= 0; i--) { skompresowane = 0; for(c = stopienKompresji - 1; c >= 0; c--) { cin >> znak; znak -= 'a'; skompresowane += znak * *(potegi + c); } if(skompresowane != *(tablicaSkompresowana + i)) { cout << "NIE"; return 0; } } cout << "TAK"; return 0; } } else { // nie wiemy, ile znaków :-( string input; cin >> input; ile = input.length(); polowa = ile / 2; for(i = 0; i < polowa; i++) { if(input[i] != input[ile - i - 1]) { cout << "NIE"; return 0; } } cout << "TAK"; return 0; } cout << "NIE"; return 0; } |