最長迴文串-manacher演算法模板
阿新 • • 發佈:2018-12-16
給出一個只由小寫英文字元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
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=3e5+10; char s[maxn],str[maxn]; int len1,len2,ans,p[maxn]; void init() { str[0]='$'; str[1]='#'; for(int i=0;i<len1;i++) { str[2*i+2]=s[i]; str[2*i+3]='#'; } len2=len1*2+2; str[len2]='*'; } void manacher() { int id=0,mx=0; for(int i=1;i<len2;i++) { if(mx>i) p[i]=min(p[2*id-i],mx-i); else p[i]=1; for(;str[i+p[i]]==str[i-p[i]];p[i]++) if(p[i]+i>mx) { mx=p[i]+i; id=i; } } } int main() { while(~scanf("%s",s)) { len1=strlen(s); init(); manacher(); ans=0; for(int i=0;i<len2;i++) ans=max(ans,p[i]); printf("%d\n",ans-1); } }