题解 P6312 【[PA2018]Palindrom】
题目大意
输入一个字符串
题解
由于题目的空间限制非常小(
考虑使用一个非常传统的字符串哈希:
但是我们同时要计算出
我们能够发现,
如果我们记
两者都可以很容易地维护。最后比较
参考代码
#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const int INF = 2147483647;
typedef unsigned int u32;
typedef unsigned long long u64;
char c; int h1, h2, g1, g2, tmp, base1 = 1, base2 = 1;
const int BASE1 = 13331, MOD1 = 1e9 + 7;
const int BASE2 = 131 , MOD2 = 1e9 + 9;
int main(){
while(!isalpha(c = getchar()));
do{
h1 = (1ll * h1 * BASE1 + c) % MOD1;
h2 = (1ll * c * base1 + h2) % MOD1;
base1 = 1ll * base1 * BASE1 % MOD1;
g1 = (1ll * g1 * BASE2 + c) % MOD2;
g2 = (1ll * c * base2 + g2) % MOD2;
base2 = 1ll * base2 * BASE2 % MOD2;
}while(isalpha(c = getchar()));
puts(h1 == h2 && g1 == g2 ? "TAK" : "NIE");
return 0;
}