[BZOJ3676][Apio2014]回文串(回文自动机)

题目描述

传送门

题解

回文自动机裸题。
不知道什么是回文自动机的安利一下

代码

#include
#include
#include
#include
#define N 300010
#define LL long long
char s[N];
int n,now,cur,fail[N],cnt[N],len[N],tot,last,ch[N][26];
LL ans;

int newnode(int x)
{
    len[tot]=x;
    return tot++;
}
int get_fail(int x,int n)
{
    while(s[n-len[x]-1]!=s[n]) x=fail[x];
    return x;
}
LL Max(LL a,LL b)
{
    return (a>b)?a:b;
}
int main(){
    gets(s+1);
    s[0]=-1;newnode(0);newnode(-1);fail[0]=1;
    for(n=1;s[n];++n)
    {
        s[n]-='a';
        cur=get_fail(last,n);
        if (!ch[cur][s[n]])
        {
            now=newnode(len[cur]+2);
            fail[now]=ch[get_fail(fail[cur],n)][s[n]];
            ch[cur][s[n]]=now;
        }
        cnt[last=ch[cur][s[n]]]++;
    }
    for(n=--tot;n>1;--n)
        cnt[fail[n]]+=cnt[n],ans=Max(ans,(LL)cnt[n]*(LL)len[n]);
    printf("%lld\n",ans);
}


你可能感兴趣的:(题解,回文自动机)