1. 程式人生 > >【模板】Manacher(洛谷P3805)

【模板】Manacher(洛谷P3805)

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