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;
}