【APIO2014T1】回文串-回文自动机(PAM)模板题
来源:互联网 发布:orange软件下载 编辑:程序博客网 时间:2024/06/05 17:09
测试地址:回文串
做法:这道题可以用Manacher+后缀数组来做,但是很慢,于是本人用了一个上午去学习了回文自动机(Palindromic Automaton,PAM)这个东西,它是一个可以接受字符串的所有回文子串的自动机,并且可以很方便地求出所有本质不同的回文子串的一些信息,教程可以看这个。看完之后其实这就是一道PAM的裸题了,求出每一个本质不同的回文子串的长度和出现的次数,然后枚举求最大值就可以了。
以下是本人代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define ll long longusing namespace std;int n,now=0,tot=1,pos;ll ans=0;char s[300010];struct PAMnode{ ll len,cnt; int fail,ch[30];}nd[300010];int getfail(int x){ while (s[pos-nd[x].len-1]!=s[pos]) x=nd[x].fail; return x;}void insert(int c){ c-='a'; now=getfail(now); if (!nd[now].ch[c]) { int son=++tot; nd[now].ch[c]=son;nd[son].fail=nd[getfail(nd[now].fail)].ch[c];nd[son].len=nd[now].len+2;nd[son].cnt=1;for(int i=0;i<=25;i++) nd[son].ch[i]=0; } else nd[nd[now].ch[c]].cnt++; now=nd[now].ch[c];}int main(){ s[0]='#'; scanf("%s",&s[1]); n=strlen(s)-1; nd[0].len=nd[0].cnt=0,nd[0].fail=1; for(int i=0;i<=25;i++) nd[0].ch[i]=0; nd[1].len=nd[n+1].len=-1,nd[1].fail=n+1,nd[1].cnt=0; for(int i=0;i<=25;i++) nd[1].ch[i]=nd[n+1].ch[i]=0; for(pos=1;pos<=n;pos++) insert(s[pos]); for(int i=tot;i>=2;i--) nd[nd[i].fail].cnt+=nd[i].cnt; for(int i=2;i<=tot;i++) ans=max(ans,nd[i].len*nd[i].cnt); printf("%lld",ans); return 0;}
0 0
- 【APIO2014T1】回文串-回文自动机(PAM)模板题
- 回文自动机 PAM
- 回文自动机 模板 bzoj3676【Apio2014】回文串
- [BZOJ3676][Apio2014]回文串(回文自动机)
- bzoj3676 [Apio2014]回文串(回文自动机)
- bzoj3676 回文串 回文自动机
- BZOJ3676: [Apio2014]回文串(后缀自动机+manacher/回文自动机)
- bzoj 3676: [Apio2014]回文串 (回文自动机)
- BZOJ 3676 Apio2014 回文串 回文自动机
- Bzoj2565:最长双回文串:回文自动机
- Bzoj3676:[Apio2014]回文串:回文自动机
- 【BZOJ3676】[Apio2014]回文串 【回文自动机】
- BZOJ 3676 [Apio2014]回文串 回文自动机
- BZOJ 3676: [Apio2014]回文串 回文自动机
- [BZOJ]3676: [Apio2014]回文串 回文自动机
- [回文自动机] BZOJ3676 [Apio2014] . 回文串
- [BZOJ]3676 [APIO2014] 回文串 回文自动机
- HDU 3068 最长回文 (回文自动机)
- 时间指令stat内容详解
- Unity3d 与罗技G29交互
- 虚拟机内存
- js中typeof的用法详解
- java求两个数的最大公约数
- 【APIO2014T1】回文串-回文自动机(PAM)模板题
- 三维扫描仪[6]——常用软件及开发环境
- iOS——UISwitch
- Adobe Flash Builder 4.7破解方法(绝对可用)
- Intellij Idea 中Java文件太长导致无法识别问题
- 负载均衡1.5--案例(中)
- JS中对时间的基本操作测试
- 如何在Rancher Catalog中使用VMware Harbor
- 【OpenCV3】图像翻转——cv::flip()详解