Manacher演算法--O(n)迴文子串演算法
詳細瞭解請看以下連結:
Problem Description
給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字串,如aba, abba等
Input
輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S 兩組case之間由空行隔開(該空行不用處理) 字串長度len <= 110000
Output
每一行一個整數x,對應一組case,表示該組case的字串中所包含的最長迴文長度.
Sample Input
aaaa abab
Sample Output
4 3
AC程式碼:
#include<bits/stdc++.h> using namespace std;
const int maxn=2e5+10;
char a[maxn],b[maxn]; int p[maxn];
int main(){ while(~scanf("%s",b+1)){ int n,m,cnt=1,mxx=1,id=1,ans=0; m=strlen(b+1); for(int i=1;i<=m;i++){ a[cnt]='#'; cnt++; a[cnt]=b[i]; cnt++; } for(int i=1;i<=cnt;i++){ if(mxx<=i) p[i]=1; else p[i]=min(p[id*2-i],mxx-i); while(a[i+p[i]]==a[i-p[i]]) p[i]++; if(i+p[i]>mxx){ mxx=i+p[i]; id=i; } if(p[i]>ans){ if(i&1) ans=p[i]/2*2; else ans=(p[i]-1)/2*2+1; } } printf("%d\n",ans); } return 0; }