bzoj千题计划304:bzoj3676: [Apio2014]回文串

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj千题计划304:bzoj3676: [Apio2014]回文串相关的知识,希望对你有一定的参考价值。

https://www.lydsy.com/JudgeOnline/problem.php?id=3676

 

回文自动机模板题

4年前的APIO如今竟沦为模板,,╮(╯▽╰)╭,唉

 

 

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define N 300001

char ss[N];
int s[N];

int tot=1,last;
int fail[N],len[N],cnt[N];
int tr[N][26];
int p,c,np,t;


void extend(int i)
{
    p=last; c=s[i];
    while(s[i-1-len[p]]!=c) 
        p=fail[p];
    if(!tr[p][c])
    {
        np=++tot;
        len[np]=len[p]+2;
        t=fail[p];
        while(s[i-1-len[t]]!=c) t=fail[t];
        fail[np]=tr[t][c];
        tr[p][c]=np;
    }
    else np=tr[p][c];
    cnt[last=np]++;
}

int main()
{
    scanf("%ss",ss+1);
    int n=strlen(ss+1);
    s[0]=-1;
    for(int i=1;i<=n;++i) s[i]=ss[i]-\'a\';
    fail[0]=1; len[1]=-1;
    for(int i=1;i<=n;++i) 
        extend(i);
    for(int i=tot;i>1;--i) cnt[fail[i]]+=cnt[i];
    long long ans=0;
    for(int i=2;i<=tot;++i) ans=max(ans,1LL*cnt[i]*len[i]);
    printf("%lld",ans);
}

 

以上是关于bzoj千题计划304:bzoj3676: [Apio2014]回文串的主要内容,如果未能解决你的问题,请参考以下文章

bzoj千题计划197:bzoj4247: 挂饰

bzoj千题计划118:bzoj1028: [JSOI2007]麻将

bzoj千题计划165:bzoj5127: 数据校验

bzoj千题计划144:bzoj1176: [Balkan2007]Mokia

bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

bzoj千题计划142:bzoj3144: [Hnoi2013]切糕