1. 程式人生 > >Manacher演算法--O(n)迴文子串演算法

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; }