#include<bits/stdc++.h>
#define N 110009
using namespace std;
typedef unsigned long long ull;
const int bas=27;
char s[N];
ull lh[N],rh[N],p[N];
int a,b,ans,len;
int get(int maxl,int a,int b){
int r=maxl,l=b;
while(l<=r){
int mid=(l+r)/2;
int temp=a-mid+b;
int left=lh[mid]-lh[b-1]*p[mid-b+1];
int right=rh[temp]-rh[a+1]*p[mid-b+1];
if(left!=right){
r=mid-1;
}else{
l=mid+1;
}
}
return r-b+1;
}
int main(){
p[0]=1;
for(int i=1;i<N;i++){
p[i]=p[i-1]*bas;
}
while(~scanf("%s",s+1)){
len=strlen(s+1);
memset(rh,0,sizeof(rh));
memset(lh,0,sizeof(lh));
for(int i=1;i<=len;i++){
lh[i]=lh[i-1]*bas+s[i]-'a';
}
for(int i=len;i>0;i--){
rh[i]=rh[i+1]*bas+s[i]-'a';
}
ans=1;
for(int i=1;i<=len;i++){
if(s[i]==s[i+1]){
a=get(min(2*i,len),i,i+1);
ans=max(2*a,ans);
}
if(s[i-1]==s[i+1]){
b=get(min(2*i-1,len),i-1,i+1);
ans=max(2*b+1,ans);
}
}
printf("%d\n",ans);
}
}
模板积累——记忆化hash数组
最新推荐文章于 2022-12-16 20:38:00 发布