manacher 板子

这个东西不难,不知道回文自动机咋样,掌握一种简单的写法就好了。

洛谷板子,欢迎来hack

#include <cstdio>
#include <cstring>
int min(int x,int y){return x<y?x:y;}
const int N=22000010;
char s[N],c[N>>1];
int n,a[N],ans;
int main()
{
    scanf("%s",c+1);
    n=strlen(c+1);
    s[0]=s[1]='#';
    for(int i=1;i<=n;i++)
        s[i*2]=c[i],s[i*2+1]='#';
    n=(n<<1)-1;
    for(int rig=0,mid,i=1;i<=n;i++)
    {
       a[i]=i>rig?1:min(rig-i,a[(mid<<1)-i]);
       while(s[i-a[i]]==s[i+a[i]]) ++a[i];
       --a[i];
       if(a[i]+i>rig) rig=a[i]+i,mid=i;
       ans=ans>a[i]?ans:a[i];
    }
    printf("%d\n",ans);
    return 0;
}
posted @ 2018-10-29 23:17  露迭月  阅读(211)  评论(0编辑  收藏  举报