码迷,mamicode.com
首页 > Windows程序 > 详细

P3649 [APIO2014]回文串

时间:2018-12-11 11:23:39      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:def   mes   pre   typedef   +=   last   problem   show   lan   

P3649 [APIO2014]回文串

题目大意

求在一个字符串内,一个回文子串的长度*出现次数的最大值

回文自动机PAM的模板题

建树的时候统计一下当前节点表示的回文串出现的次数

最后扫一遍更新答案,记得$for$时要把值上传

My complete code: 

#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
typedef long long LL;
const LL maxn=300100;
struct node{
    LL son[26],fail,len,val;
}tree[maxn];
LL len,ans,last,nod;
char s[maxn];
int main(){
    scanf(" %s",s+1);
    len=strlen(s+1);
    for(LL i=1;i<=len;++i)
        s[i]-=‘a‘;
    s[0]=‘#‘;
    tree[0].fail=1; tree[0].len=0;
    tree[1].fail=0; tree[1].len=-1;
    last=0;
    nod=1;
    for(LL i=1;i<=len;++i){
        while(s[i-tree[last].len-1]!=s[i])
            last=tree[last].fail;
        if(!tree[last].son[s[i]]){
            tree[++nod].len=tree[last].len+2;
            LL j=tree[last].fail;
            while(s[i-tree[j].len-1]!=s[i])
                j=tree[j].fail;
            tree[nod].fail=tree[j].son[s[i]];
            tree[last].son[s[i]]=nod;
        }
        last=tree[last].son[s[i]];
        ++tree[last].val;
    }
    for(LL i=nod;i>=2;--i){
        tree[tree[i].fail].val+=tree[i].val;
        if(tree[i].val*tree[i].len>ans)
            ans=tree[i].val*tree[i].len;
    }
    printf("%lld",ans);
    return 0;
}

  

P3649 [APIO2014]回文串

标签:def   mes   pre   typedef   +=   last   problem   show   lan   

原文地址:https://www.cnblogs.com/y2823774827y/p/10100248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!