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

 

posted @ 2018-04-01 17:19  TRTTG  阅读(149)  评论(0编辑  收藏  举报