字符串哈希
题目链接:字符串哈希
题目描述
解题思路
正反各一遍 h a s h hash hash 。
枚举每个点为回文串中心的情况。
分类讨论奇偶。
二分长度。
code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
string s;
ll n,ans;
int ghs=0;
ll p[1000010];
ll a[1000010],b[1000010];
int main()
{
p[0]=1;
for(int i=1;i<=1000010;i++)
p[i]=p[i-1]*131ull;
ghs=0;
while(cin>>s)
{
if(s=="END")
return 0;
s=" "+s;
ghs++;
n=s.size();
ans=0;
for(int i=1;i<=n;i++)
a[i]=(a[i-1]*131ull+s[i]-'a'+1);
for(int i=n;i>=1;i--)
b[i]=(b[i+1]*131ull+s[i]-'a'+1);
for(int i=1;i<=n;i++)
{
ll l=1,r=n;
while(l<=r)
{
ll mid=(l+r)/2;
if(i-mid-1<0||i+mid+1>n)
{
r=mid-1;
continue;
}
else if(a[i]-a[i-mid-1]*p[mid+1]==b[i]-b[i+mid+1]*p[mid+1])
l=mid+1,ans=max(ans,mid*2+1);
else
r=mid-1;
}
l=1,r=n;
while(l<=r)
{
ll mid=(l+r)/2;
if(i-mid<0||i+mid+1>n)
r=mid-1;
else if(a[i]-a[i-mid]*p[mid]==b[i+1]-b[i+mid+1]*p[mid])
l=mid+1,ans=max(ans,mid*2);
else
r=mid-1;
}
ans=max(ans,l);
}
printf("Case %d: %lld\n",ghs,ans);
}
}