Manacher笔记

(其实还是回文自动机好用,毛子真是牛逼)

Manacher

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 using namespace std;
 6 char s[100001];
 7 int manacher(char s[]){
 8     int maxn=0,p[200001],mx=0,id=0,len=strlen(s);
 9     char st[200001];
10     st[0]='$';
11     for(int i=0;i<len;i++){
12         st[i*2+1]='#';
13         st[(i+1)*2]=s[i];
14     }
15     st[len*2+1]='#';
16     for(int i=0;i<2*len;i++){
17         if(i<mx)p[i]=min(p[id*2-i],mx-i);
18         else p[i]=1;
19         while(st[i-p[i]]==st[i+p[i]])p[i]++;
20         if(i+p[i]>mx){
21             mx=i+p[i];
22             id=i;
23         }
24         maxn=max(maxn,p[i]-1);
25     }
26     return maxn;
27 }
28 int main(){
29     scanf("%s",s);
30     printf("%d",manacher(s));
31     return 0;
32 }

毕竟是线性算法,又好背,尊重一下人家咯~

posted @ 2018-04-26 15:33  DCDCBigBig  阅读(140)  评论(0编辑  收藏  举报