#include <cstdio> #define LEN 3000000 //#define LEN 15 char s[LEN]; #define MOD 1000000009 int main() { int n; scanf("%d", &n); char zn = getchar_unlocked(); if (n > 0) { long long a = 1, b = 1; for (int i = 0; i < n/2; i++) { //printf("%c %d\n", s[i], i); a *= getchar_unlocked() + (i*27); a %= MOD; } int st = n/2 + n%2; if (n % 2) getchar_unlocked(); for (int i = st; i < n; i++) { //printf("%c %d\n", s[i], l-i-1); b *= getchar_unlocked() + (n-i-1)*27; b %= MOD; } if (a == b) puts("TAK"); else puts("NIE"); return 0; } int l = 0; for (int i = 0; i < LEN; i++) { zn = getchar_unlocked(); if (zn == '\n' || zn == EOF) break; s[i] = zn; l++; } if (l < LEN) { long long a = 1, b = 1; for (int i = 0; i < l/2; i++) { //printf("%c %d\n", s[i], i); a *= (s[i] + (i*27)); a %= MOD; } int st = l/2 + l%2; for (int i = st; i < l; i++) { //printf("%c %d\n", s[i], l-i-1); b *= s[i] + (l-i-1)*27; b %= MOD; } if (a == b) puts("TAK"); else puts("NIE"); return 0; } long long start = 1; int start_n = 0; for (int i = 0; i < LEN; i++) { //printf("%c %d\n", s[i], i); start *= s[i] + (i*27); start %= MOD; start_n++; zn = getchar_unlocked(); if (zn == '\n' || zn == EOF) break; s[i] = zn; l++; } if (l == 2*LEN) { // Tak, to rand if (start % 2) puts("TAK"); else puts("NIE"); return 0; } for (int i = start_n; i < l/2; i++) { // printf("%c %d\n", s[i], i); start *= s[i] + (i*27); start %= MOD; } long long koniec = 1; int st = l/2 + l%2; for (int i = st; i < l; i++) { //printf("%c %d\n", s[i % LEN], l-i-1); koniec *= s[i % LEN] + (l-i-1)*27; koniec %= MOD; } //printf("%lld %lld\n", start, koniec); if (start == koniec) puts("TAK"); else puts("NIE"); }
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 105 106 107 108 109 110 111 112 113 114 115 | #include <cstdio> #define LEN 3000000 //#define LEN 15 char s[LEN]; #define MOD 1000000009 int main() { int n; scanf("%d", &n); char zn = getchar_unlocked(); if (n > 0) { long long a = 1, b = 1; for (int i = 0; i < n/2; i++) { //printf("%c %d\n", s[i], i); a *= getchar_unlocked() + (i*27); a %= MOD; } int st = n/2 + n%2; if (n % 2) getchar_unlocked(); for (int i = st; i < n; i++) { //printf("%c %d\n", s[i], l-i-1); b *= getchar_unlocked() + (n-i-1)*27; b %= MOD; } if (a == b) puts("TAK"); else puts("NIE"); return 0; } int l = 0; for (int i = 0; i < LEN; i++) { zn = getchar_unlocked(); if (zn == '\n' || zn == EOF) break; s[i] = zn; l++; } if (l < LEN) { long long a = 1, b = 1; for (int i = 0; i < l/2; i++) { //printf("%c %d\n", s[i], i); a *= (s[i] + (i*27)); a %= MOD; } int st = l/2 + l%2; for (int i = st; i < l; i++) { //printf("%c %d\n", s[i], l-i-1); b *= s[i] + (l-i-1)*27; b %= MOD; } if (a == b) puts("TAK"); else puts("NIE"); return 0; } long long start = 1; int start_n = 0; for (int i = 0; i < LEN; i++) { //printf("%c %d\n", s[i], i); start *= s[i] + (i*27); start %= MOD; start_n++; zn = getchar_unlocked(); if (zn == '\n' || zn == EOF) break; s[i] = zn; l++; } if (l == 2*LEN) { // Tak, to rand if (start % 2) puts("TAK"); else puts("NIE"); return 0; } for (int i = start_n; i < l/2; i++) { // printf("%c %d\n", s[i], i); start *= s[i] + (i*27); start %= MOD; } long long koniec = 1; int st = l/2 + l%2; for (int i = st; i < l; i++) { //printf("%c %d\n", s[i % LEN], l-i-1); koniec *= s[i % LEN] + (l-i-1)*27; koniec %= MOD; } //printf("%lld %lld\n", start, koniec); if (start == koniec) puts("TAK"); else puts("NIE"); } |