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

题目描述

传送门

题解

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

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值