#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
#define ST FI
#define ND SE
#define SZ(x) ((int)(x).size())
#define ALL(it, x) for(__typeof(x.begin()) it = x.begin(); it != x.end(); it++)
#define REP(i, x) for (int i = 0; i < x; i++)
#define FOR(i, x) for (int i = 1; i <= x; i++)
#define BACK(i, x) for (int i = x; i; i--)
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<VI> VVI;
template<typename TH> void _dbg(const char* s, TH h) { cerr<<s<<"="<<h<<"\n"; }
template<typename TH, typename... TA> void _dbg(const char* s, TH h, TA... t) {
while(*s != ',') {cerr<<*s++;} cerr<<"="<<h<<","; _dbg(s+1, t...);
}
#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#define debugv(x) {{cerr <<#x <<" = "; ALL(itt, (x)) cerr <<*itt <<", "; cerr <<"\n"; }}
#else
#define debug(...) (__VA_ARGS__)
#define debugv(x)
#define cerr if(0)cout
#endif
const char MPOD = 2, MMOD = 3;
int pods[MPOD];
int mods[MMOD];
class hasz {
public:
int8_t pi;
int8_t mi;
int pod_pow = 1;
int pref = 0, suf = 0;
void add(int d) {
pref = (pref * pods[pi] + d) % mods[mi];
suf = (suf + pod_pow * d) % mods[mi];
}
void idz_forward() {
pod_pow = (pod_pow * pods[pi]) % mods[mi];
}
void init(char pi0, char mi0) {
pi = pi0;
mi = mi0;
}
};
hasz hashes[MPOD][MMOD];
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout << setprecision(7) << fixed;
pods[0] = 29;
pods[1] = 37;
mods[0] = 1000 * 1000 * 1000 + 7;
mods[1] = 1000 * 1000 * 1000 + 9;
mods[2] = 1000 * 1000 * 1000 + 33;
REP(i, MPOD) {
REP(j, MMOD) {
hashes[i][j].init(i, j);
}
}
int a;
a = scanf("%lld", &a);
char c;
char r;
c = scanf("%c", &c);
while(1) {
r = scanf("%c", &c);
if (r != 1)
break;
if (c == 10)
break;
//cerr << r << " " << c << " " << (int)c << endl;
REP(i, MPOD) {
REP(j, MMOD) {
hashes[i][j].add(c - 'a');
hashes[i][j].idz_forward();
}
}
}
r = 1;
REP(i, MPOD) {
REP(j, MMOD) {
debug(hashes[i][j].pref, hashes[i][j].suf);
r &= (hashes[i][j].pref == hashes[i][j].suf);
}
}
if (r) {
cout << "TAK" << endl;
}
else {
cout << "NIE" << endl;
}
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include<bits/stdc++.h> using namespace std; #define int long long #define PB push_back #define MP make_pair #define FI first #define SE second #define ST FI #define ND SE #define SZ(x) ((int)(x).size()) #define ALL(it, x) for(__typeof(x.begin()) it = x.begin(); it != x.end(); it++) #define REP(i, x) for (int i = 0; i < x; i++) #define FOR(i, x) for (int i = 1; i <= x; i++) #define BACK(i, x) for (int i = x; i; i--) typedef pair<int, int> PII; typedef vector<int> VI; typedef vector<VI> VVI; template<typename TH> void _dbg(const char* s, TH h) { cerr<<s<<"="<<h<<"\n"; } template<typename TH, typename... TA> void _dbg(const char* s, TH h, TA... t) { while(*s != ',') {cerr<<*s++;} cerr<<"="<<h<<","; _dbg(s+1, t...); } #ifdef LOCAL #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #define debugv(x) {{cerr <<#x <<" = "; ALL(itt, (x)) cerr <<*itt <<", "; cerr <<"\n"; }} #else #define debug(...) (__VA_ARGS__) #define debugv(x) #define cerr if(0)cout #endif const char MPOD = 2, MMOD = 3; int pods[MPOD]; int mods[MMOD]; class hasz { public: int8_t pi; int8_t mi; int pod_pow = 1; int pref = 0, suf = 0; void add(int d) { pref = (pref * pods[pi] + d) % mods[mi]; suf = (suf + pod_pow * d) % mods[mi]; } void idz_forward() { pod_pow = (pod_pow * pods[pi]) % mods[mi]; } void init(char pi0, char mi0) { pi = pi0; mi = mi0; } }; hasz hashes[MPOD][MMOD]; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout << setprecision(7) << fixed; pods[0] = 29; pods[1] = 37; mods[0] = 1000 * 1000 * 1000 + 7; mods[1] = 1000 * 1000 * 1000 + 9; mods[2] = 1000 * 1000 * 1000 + 33; REP(i, MPOD) { REP(j, MMOD) { hashes[i][j].init(i, j); } } int a; a = scanf("%lld", &a); char c; char r; c = scanf("%c", &c); while(1) { r = scanf("%c", &c); if (r != 1) break; if (c == 10) break; //cerr << r << " " << c << " " << (int)c << endl; REP(i, MPOD) { REP(j, MMOD) { hashes[i][j].add(c - 'a'); hashes[i][j].idz_forward(); } } } r = 1; REP(i, MPOD) { REP(j, MMOD) { debug(hashes[i][j].pref, hashes[i][j].suf); r &= (hashes[i][j].pref == hashes[i][j].suf); } } if (r) { cout << "TAK" << endl; } else { cout << "NIE" << endl; } return 0; } |
English