#include<bits/stdc++.h>
#define getchar getchar_unlocked
#pragma GCC optimize("O3")
using namespace std;
const int S=2;
typedef uint_fast64_t ll;//long long ll;
const ll M[3] = {ll(1e9 + 7), ll(1e9 + 181), ll(1e9 + 363)};
const ll p[3] = {29, 37, 43};
ll pp[3];
ll h[3][2];
int ile[256];
ll wsp[32][S];
int main()
{
int n;
scanf("%d", &n);
n = 0;
srand(time(0));
for(int i=0; i < 32; ++i){
wsp[i][0] = i;
wsp[i][1] = (rand() + 1) % M[1];
}
for(int i=0; i < 3; ++i)
pp[i] = p[i];
char c;
while(c = getchar())
{
if(c >= 'a' && c <= 'z')
break;
}
while(true)
{
if(c == EOF || c == '\n')break;
++n;
++ile[c];
for(int i=0; i < S; ++i)
{
h[i][0] += wsp[(c - 'a' + 1)][i]*pp[i];
h[i][0] %= M[i];
h[i][1] *= p[i];
h[i][1] += p[i]*wsp[(c - 'a' + 1)][i];
h[i][1] %= M[i];
pp[i] = (pp[i] * p[i]) % M[i];
}
//putchar_unlocked(c);
c = getchar();
}
int np = 0;
for(int i=0; i < 256; ++i)
if(ile[i] & 1)
++np;
if(np != 0 && (n & 1) == 0)
{
puts("NIE");
return 0;
}
if(np != 1 && (n & 1))
{
puts("NIE");
return 0;
}
//puts("CHECK");
for(int i=0; i < 3; ++i)
{
//cout << h[i][0] << " " << h[i][1] << endl;
if(h[i][0] != h[i][1]){
puts("NIE");
return 0;
}
}
puts("TAK");
}
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 | #include<bits/stdc++.h> #define getchar getchar_unlocked #pragma GCC optimize("O3") using namespace std; const int S=2; typedef uint_fast64_t ll;//long long ll; const ll M[3] = {ll(1e9 + 7), ll(1e9 + 181), ll(1e9 + 363)}; const ll p[3] = {29, 37, 43}; ll pp[3]; ll h[3][2]; int ile[256]; ll wsp[32][S]; int main() { int n; scanf("%d", &n); n = 0; srand(time(0)); for(int i=0; i < 32; ++i){ wsp[i][0] = i; wsp[i][1] = (rand() + 1) % M[1]; } for(int i=0; i < 3; ++i) pp[i] = p[i]; char c; while(c = getchar()) { if(c >= 'a' && c <= 'z') break; } while(true) { if(c == EOF || c == '\n')break; ++n; ++ile[c]; for(int i=0; i < S; ++i) { h[i][0] += wsp[(c - 'a' + 1)][i]*pp[i]; h[i][0] %= M[i]; h[i][1] *= p[i]; h[i][1] += p[i]*wsp[(c - 'a' + 1)][i]; h[i][1] %= M[i]; pp[i] = (pp[i] * p[i]) % M[i]; } //putchar_unlocked(c); c = getchar(); } int np = 0; for(int i=0; i < 256; ++i) if(ile[i] & 1) ++np; if(np != 0 && (n & 1) == 0) { puts("NIE"); return 0; } if(np != 1 && (n & 1)) { puts("NIE"); return 0; } //puts("CHECK"); for(int i=0; i < 3; ++i) { //cout << h[i][0] << " " << h[i][1] << endl; if(h[i][0] != h[i][1]){ puts("NIE"); return 0; } } puts("TAK"); } |
English