洛谷p3805 manacher模板题
复杂度证明:
令
f
i
f_i
fi表示第i个字母while进行的次数,
m
x
i
mx_i
mxi表示第i次结束后mx的值。可知,mx是非降的
可得
f
i
=
m
x
i
−
m
x
i
−
1
(
i
<
=
m
x
i
−
1
)
f_i=mx_i-mx_{i-1}\;(i<=mx_{i-1})
fi=mxi−mxi−1(i<=mxi−1)
f
i
=
m
x
i
−
i
(
i
>
m
x
i
−
1
)
f_i=mx_i-i\;(i>mx_{i-1})
fi=mxi−i(i>mxi−1)
所以
∑
i
=
1
n
f
i
≤
∑
i
=
1
n
m
x
i
−
m
x
i
−
1
=
n
\sum_{i=1}^nf_i\le\sum_{i=1}^nmx_i-mx_{i-1}=n
∑i=1nfi≤∑i=1nmxi−mxi−1=n
所以是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;
}