原文链接www.cnblogs.com/zhouzhendong/p/PAM.html

前置知识

无。

(强行说和KMP有关也是可以的……)

关于回文串的一些性质

1. 一个长度为 n 的字符串最多有 n 个本质不同的回文子串。

2. 对于一个字符串 S,如果在其之后新插入一个字符,那么最多产生一种新的回文子串。

 证明:

  假设加入这个字符之后得到的最长回文后缀为 T,那么对于长度小于 T 的任何回文后缀,它们必然在更前面的位置出现过。如图所示:

    

  所以只有 T 可能是新的回文子串。

构造PAM

  记 len[x] 表示节点 x 代表的回文串长度,设 Fail[x] 表示“代表 节点 x 所代表的回文串的最长回文后缀 的节点”。(注意这里的最长回文后缀是指长度小于原串的最长回文后缀,和后面提到的意义有差别)

  设 Next[x][c] 表示节点 x 所代表的字符串在前后都加上一个字符 c 之后所到达的状态。则必然有 len[x] + 2 = len[Next[x][c]] 。

  首先,我们建两个节点 A 和 B 。设 len[A] = -1, len[B] = 0 。

  于是长度为 1 的回文串就可以有 A 走转移边到达。

  接下来考虑如何构建 PAM 。

  考虑增量法,在串 s 后面加入一个字符 c 后, PAM 变成了怎样?

  假设当前插入的字符是 s[i],字符串 s 的第 k 个字符为 s[k] 。

  设 x 表示 s 的最长回文后缀,那么如果 s[i - len[x] - 1] = s[i] ,那么最长回文后缀就是 Next[x][s[i]];否则不断使 x = Fail[x] ,直到满足条件就找到了 s 的最长回文后缀。

  找到之后,如果 Next[x][s[i]] 这个节点已经存在,那么什么也不用干;否则,我们新建一个节点代表 Next[x][s[i]] , len[Next[x][s[i]]] = len[x] + 2 ,那么如何求 Fail[Next[x][s[i]]] ?

  考虑找到使 x = Fail[x] ,末尾加入字符 s[i] 之后,再找一次最长回文后缀即可。

模板

namespace PAM{
int len[N],Fail[N],Next[N][26];
int cnt;
void init(){
cnt=2;
len[1]=-1,Fail[1]=1;
len[2]=0,Fail[2]=1;
clr(Next);
}
void build(char *s,int n){
init();
s[0]='*';
int x=1;
for (int i=1;i<=n;i++){
while (s[i-len[x]-1]!=s[i])
x=Fail[x];
int c=s[i]-'a';
if (Next[x][c])
x=Next[x][c];
else {
int y=Next[x][c]=++cnt;
len[y]=len[x]+2;
if (len[y]==1)
Fail[y]=2;
else {
x=Fail[x];
while (s[i-len[x]-1]!=s[i])
x=Fail[x];
Fail[y]=Next[x][c];
}
x=y;
}
}
}
}

模板题

UOJ#103. 【APIO2014】Palindromes

传送门:http://uoj.ac/problem/103

回文自动机(PAM) 学习笔记的更多相关文章

  1. 回文树/回文自动机(PAM)学习笔记

    回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的 ...

  2. 回文树(回文自动机PAM)小结

    回文树学习博客:lwfcgz    poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~ ...

  3. 回文自动机pam

    目的:类似回文Trie树+ac自动机,可以用来统计一些其他的回文串相关的量 复杂度:O(nlogn) https://blog.csdn.net/Lolierl/article/details/999 ...

  4. 回文自动机(PAM) 入门讲解

    处理回文串,Manacher算法也是很不错,但在有些问题的处理上比较麻烦,比如求本质不同的子串的数量还需要结合后缀数组才能解决.今天的们介绍一种能够方便的解决关于回文串的问题的算法--PAM. 一些功 ...

  5. 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习

    写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ...

  6. 省选算法学习-回文自动机 && 回文树

    前置知识 首先你得会manacher,并理解manacher为什么是对的(不用理解为什么它是$O(n)$,这个大概记住就好了,不过理解了更方便做$PAM$的题) 什么是回文自动机? 回文自动机(Pal ...

  7. 洛谷P5496 回文自动机【PAM】模板

    回文自动机模板 1.一个串的本质不同的回文串数量是\(O(n)\)级别的 2.回文自动机的状态数不超过串长,且状态数等于本质不同的回文串数量,除了奇偶两个根节点 3.如何统计所有回文串的数量,类似后缀 ...

  8. URAL 2040 Palindromes and Super Abilities 2 (回文自动机)

    Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...

  9. 【XSY2715】回文串 树链剖分 回文自动机

    题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...

  10. 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)

    模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...

随机推荐

  1. Docker安装rabbitmq

    前面的文章中我们的docker已经安装好了,我的最终目的是用docker来安装rabbitmq,所以本文我记录一下我用docker安装rabbitmq的过程: 1.下载镜像(下载management的 ...

  2. design language

    design language https://en.wikipedia.org/wiki/Design_language 设计语言(设计词汇)是一种超架构的方案和风格, 它用于指导产品组件或者架构配 ...

  3. 生成ISO文件

    cat /dev/cdrom > image.iso dd if=/dev/cdrom of=image.iso mkisofs -V "Label" -o image.is ...

  4. [算法竞赛入门经典]Ancient Cipher, NEERC 2004,UVa1339

    Description Ancient Roman empire had a strong government system with various departments, including ...

  5. maven相关配置

    复习了下maven的常用配置及相关解释,直接看的前辈们的博客, maven核心,pom.xml详解(转)

  6. java项目发布到linux服务器,tomcat正常启动但没加载项目

    问题描述: java项目发布到linux服务器,一切操作正确,linux命令启动tomcat后,查看日志启动tomcat正常,上传的war包已经解压成功,但是tomcat没加载项目. 解决方法: 1. ...

  7. gunicorn+anaconda+nginx部署django项目(ubuntu)

    首先进入conda 虚拟环境: source activate test 安装gunicorn: pip install gunicorn 运行gunicorn gunicorn -w 2 -b 12 ...

  8. winform 以不规则图形背景显示窗体

    一:创建一个winform窗体,把BackgroundImage引入一个不规则的图片,设置属性BackgroundImageLayout为Stretch 二:主要代码 using System; us ...

  9. day 22 - 2 面向对象练习

    练习一 在终端输出如下信息 小明,10岁,男,上山去砍柴小明,10岁,男,开车去东北小明,10岁,男,最爱大保健老李,90岁,男,上山去砍柴老李,90岁,男,开车去东北老李,90岁,男,最爱大保健老张 ...

  10. axios formData提交数据 && axios设置charset无效???

    但是这样会出现一个问题,什么问题呢? 我设置了请求头编码utf-8,但是没生效 content-type里面没有出现utf-8???????查了很多资料,说这是axios固有的bug,我....... ...