[https://ac.nowcoder.com/acm/contest/13504/A]
如何判断一个前缀是不是回文串,用字符串哈希,判断正过来读以及倒过来读两个字符对应的Hash值是否相等即可。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0),cin.tie(0);
using namespace std;
const int N=2e5+10,P=131;
typedef unsigned long long ull;
ull p[N],h[N],t[N];
char s[N];
int n;
ull queryh(int l,int r)
{
return h[r]-h[l-1]*p[r-l+1];
}
ull queryt(int l,int r)
{
return t[r]-t[l-1]*p[r-l+1];
}
int main ()
{
scanf("%s",s+1);
n=strlen(s+1);
p[0]=1;
for(int i=1;i<=n;i++)
{
p[i]=p[i-1]*P;
h[i]=h[i-1]*P+s[i]-'a'+1;
}
for(int i=1;i<=n;i++)
{
t[i]=t[i-1]*P+s[n-i+1]-'a'+1;
}
int res=1;
for(int i=2;i<=n;i++)
{
if(queryh(1,i/2+i%2)==queryh(i/2+1,i))//前后相等
{
//判断1->(i/2+i%2)是不是回文串
int len=i/2+i%2;
int mid=len/2;
//判断(1->mid)以及(len->mid)是否相等
if(queryh(1,mid)==queryt(n-len+1,n-len+mid))res++;
}
}
cout<<res<<endl;
}