洛谷p3805 manacher模板题
复杂度证明:
令
表示第i个字母while进行的次数,
表示第i次结束后mx的值。可知,mx是非降的
可得
所以
所以是O(n)
代码
#include<iostream>
#include<cstdio>
using namespace std;
char s[22000005];
int ans,n,p[22000005];
void gt()
{
char ch=getchar();
s[0]='.',s[n=1]='/';
while(ch<'a'||ch>'z')ch=getchar();
while(ch>='a'&&ch<='z')
{
s[++n]=ch;
s[++n]='/';
ch=getchar();
}
}
int main()
{
gt();
for(int i=1,mx=0,mid=0;i<=n;++i)
{
if(i<=mx)p[i]=min(p[2*mid-i],mx-i+1);
while(s[i+p[i]]==s[i-p[i]])++p[i];
if(i+p[i]>mx)mid=i,mx=i+p[i]-1;
ans=max(ans,p[i]);
}
printf("%d\n",ans-1);
return 0;
}