今天是2017/7/8,DCDCBigBig的第二十一篇博文
额。。。最近准备期末考,有接近一个月没上博客了。。。这几天在eg集训,学了些玄妙的新算法准备NOIP提高组,就来发一下(期末考爆炸啦蛤蛤)
Manacher
哇O(n)时间求出回文字串,这个算法真是够赞的
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char s[100001];
int manacher(char s[]){
int maxn=0,p[200001],mx=0,id=0,len=strlen(s);
char st[200001];
st[0]='$';
for(int i=0;i<len;i++){
st[i*2+1]='#';
st[(i+1)*2]=s[i];
}
st[len*2+1]='#';
for(int i=0;i<2*len;i++){
if(i<mx)p[i]=min(p[id*2-i],mx-i);
else p[i]=1;
while(st[i-p[i]]==st[i+p[i]])p[i]++;
if(i+p[i]>mx){
mx=i+p[i];
id=i;
}
maxn=max(maxn,p[i]-1);
}
return maxn;
}
int main(){
scanf("%s",s);
printf("%d",manacher(s));
return 0;
}