#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
char s0[maxn];
char s[maxn<<2];
int p[maxn<<2];
int main()
{
#ifdef LOCAL
freopen("input.in","r",stdin);
// freopen("output.in","w",stdout);
#endif
scanf("%s",s0);
int len= strlen(s0);
for(int i=len;i>=1;i--)
{
s[2*i+1]='#';
s[2*i]=s0[i-1];
}
s[0]='@';
s[1]='#';
// printf("%s\n",s);
int mx=0,id=0,ans=0;
len=strlen(s);
for(int i=1;i<len;i++)
{
// cout<<id<<" "<<mx<<" "<<ans<<endl;
if(mx>i) p[i]=min(p[id*2-i],mx-i);
else p[i]=1;
while(s[i+p[i]]==s[i-p[i]]) p[i]+=1;
if(mx<p[i]+i)
{
id=i;
mx=p[i]+i;
}
ans=max(ans,p[i]-1);
}
// for(int i=0;i<len;i++) printf("%d ",p[i]);
printf("%d\n",ans);
return 0;
}
manacher算法
最新推荐文章于 2020-02-28 18:55:46 发布