【模板】Manacher(洛谷P3805)
阿新 • • 發佈:2018-11-06
Description
給出一個只由小寫英文字元\(a,b,c...y,z\)組成的字串\(S\),求\(S\)中最長迴文串的長度.字串長度為\(n\)
Input
一行小寫英文字元\(a,b,c...y,z\)組成的字串\(S\)
Output
一個整數表示答案
Solution
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; char ch[11000010],s[22000010]; int len[22000010],pos,last; int main() { scanf("%s",ch+1); int l=strlen(ch+1); s[0]='$'; for (int i=1;i<=l;i++) { s[2*i-1]='#'; s[2*i]=ch[i]; } s[2*l+1]='#',s[2*l+2]='@'; l=2*l+2; for (int i=1;i<l;i++) { if (last>=i) len[i]=min(last-i,len[2*pos-i]); while (s[i-len[i]-1]==s[i+len[i]+1]) len[i]++; if (i+len[i]>last) { last=i+len[i]; pos=i; } } int ans=0; for (int i=1;i<l;i++) ans=max(ans,len[i]); printf("%d\n",ans); return 0; }