想了想 还是要先把字符串的东西先都学完告一段落了再说 时间不多了 加油~。

PAM 回文自动机 比SAM简单到不知道哪里去了。

回文自动机和其他自动机一样有字符集 有状态 有转移。

一个字符串的回文自动机的一个最显然的性质是可以识别一个字符串中所有回文子串 这是最有价值的性质。

特点:有两个根 一个代表偶回文串的根 一个代表奇回文串的根 具体的 每个点 同SAM的节点一样都有len fail t[x][c]数组。

可以说 fail指针是所有字符串自动机的精髓吧... 值得一提的是 奇数根的len为-1 偶数根的len为0。

另外 这里我说一下我对fail的理解 这个就很有意思了这里规定偶数根的标号为0 奇数根的编号为1 偶数根的fail为1 奇数根的fail为1\0

对了,fail在回文自动机里的意思是指最长公共回文后缀。偶数根的fail之所以是1是因为接下来只有奇数根的那个位置能够满足了。

奇数根的fail是无效的 因为只要跳到奇数根就意味着一定是合法的了.

还是采用增量法 来构造这个回文自动机。 考虑 上一次构造出来的节点是 p 当前字符为s[i]

那么显然 我们当前这个节点由于是要加到p的后面的 所以 我们要看 s[i-len[p]-1] 和 s[i]是否是相等的 如果相等那么就可以安排一下p的儿子了。

不相等呢 我们考虑围绕这个p搞一些事情 可能存在其他更小的回文串满足这个性质 那么显然我们对p不断的寻找 然后找到一个p满足上述条件。

一直都不满足?最后会跳到奇数根 就满足了。考虑一下更新的信息 设np是当前新建节点 显然 len[np]=len[p]+2;

fail[np]怎么求呢?fail[np]显然我们继续跳p的fail指针然后找到下一个满足条件的点 就是我们当前的fail[np]了。

这里有好几个小细节 如 如果不存在fail[np]那么这个fail[np]是0 还是1 呢 应该是0的是1的话就不对了因为这个地方其实就是这样的fail如果没有实际的点一般都是0而并非1 这样可以让下一个来的字符先满足长度为2的回文串。

还有一点是 为什么这样做事最长的 归纳一下吧 显然 fail[p]按照定义是最长的 那么 fail[np]在fail[p]下也应该是最长的。

一个细节:我们虽然新建了np但是我们不能直接让p连向np 因为如果p是1的话跳fail会跳到np自己的fail指向自己就不太对了吧...

下面是 一个回文自动机可以表示出一个字符串的所有回文子串的证明:

增量法构造的时 新来一个字符c 可能此时形成了多个回文串我们考虑一下最长的那个回文串是否被建好了 如果最长的已经建好了 说明那些较短的回文串也被建好了,因为这个回文串中肯定是包含其他的回文串的,也就是增量到对应的节点的时候这里指回文串的右边显然已经被构造好了所以得证。

如果最长的没有被建好 那么建出来 然后其他的野已经被建好了 还是回文串的右边在增量的时候...得证.

最后 好像还有人求了一发 trans指针 我不知道这个有啥用 但是这个trans指针还是非常容易求出的.

trans指针:小于等于当前节点长度的一半的最长回文后缀。

显然 当len[p]那么考虑更一般的情况 新建节点np 的trans[np]=? 抓住关键...从trans[p]开始跳fail即可且保证能扩展和len满足要求即可...

PAM其实就这么多的东西我的理解我觉得没有什么偏差...对了边数和点数都是O(n)级别的 点数显然 边数也显然...时间复杂度我不会证明但是是O(n)的...

说完了上面 你可能会惊奇的发现 一个字符串的本质不同的回文子串的个数是O(n)级别的.空间的话觉得不太稳开两倍.

至此完结~ 下面可能会放几道有意思的题目...

[SHOI2011双倍回文](https://www.luogu.com.cn/problem/P4287)

给定一个字符串 求这个字符串的最长双倍回文子串的长度,最长双倍回文子串的定义:长度是4的倍数,前半部分是回文的,后半部分也是回文的,且整体还是回文的.

看起来很不好做的样子... 分析一下性质吧 有意思的是 双倍回文子串的两半都必须是偶回文串 因为不是的话不可能是4的倍数.

解法也就出现了 遍历每一个回文串 惊奇的发现 利用trans指针就可以解决这个问题!由于我们遍历了所有的本质不同字符串所以显然可以求得答案.

[最长双回文串](https://www.luogu.com.cn/problem/P4555)

这道题也很简单 但是却有一些小套路在里面 两端都是回文串 一个比较容易想到的是 枚举断点i 求以i为结尾最长的和以i+1位开头的最长的回文串加起来即可。

这思想在很多题目中都有应用。

[CERC2014 Virus synthesis](https://www.luogu.com.cn/problem/P4762)

多组数据 每组数据给定一个字符集为{A,G,C,T}的字符串T 初始有一个空串 每次可以在串的开头或结尾加上一个字符 或者在串开头或末尾加上一个该串的逆串.

求最小操作次数。显然是不可以二分的,因为构造出这个字符串我们可以直接求出二分再构造无疑是不必要的。

由于是串的逆序 可以发现显然应该是T的回文子串 但是是整个字符串的回文 所以我们肯定是先构造出某个回文串剩下的再暴力构造。

这就又需要我们的trans指针了 好像这样dp下一下就没了...但是 我没想到一个转移啊啊啊

f[i]=min(f[i],f[f(i)]+1)这个转移没写 我想半天以为思路出错了 结果是根本就没有完善好思路 哎.

考虑一个性质 我们不单需要trans指针 也可能是直接的暴力累加过来的...我是dd.

PAM学习笔记的更多相关文章

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

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

  2. C++学习笔记(2)

    本学习笔记是C++ primer plus(第六版)学习笔记.是C++学习笔记(1)的后续.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p ...

  3. Beego学习笔记——Logs

    日志处理 这是一个用来处理日志的库,它的设计思路来自于database/sql,目前支持的引擎有file.console.net.smtp,可以通过如下方式进行安装: go get github.co ...

  4. 后缀自动机&回文自动机学习笔记

    在学了一天其实是边学边摆之后我终于大概$get$后缀自动机了,,,就很感动,于是时隔多年我终于决定再写篇学习笔记辽$QwQ$ $umm$和$FFT$学习笔记一样,这是一篇单纯的$gql$的知识总结博, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. 简单的JdbcUtil 类

    import java.sql.*; /** JDBC工具类 */ public class JdbcUtil { /** * 获取数据库连接对象并返回 * * @return Connection对 ...

  2. Evacuation,题解

    题目: 题意: 有人,门(只有边上有,且1s只能出去一个人),和墙,每s人可移动一个格子,问多少秒所有人可以逃出,逃不出输出“impossible” 分析: 首先,我们先想着样一个问题,如果这个人在某 ...

  3. 洛谷 P4408 [NOI2003]逃学的小孩

    题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚, ...

  4. H5+CSS复习笔记(全)

    1.自结束标签和注释 通常标签都是成对出现,如<h1></h1>,<div></div>等等.但是又些标签是没有结束标签的,成为自结束标签,如<i ...

  5. 《Spring全局异常处理》从零掌握@ControllerAdvice注解

    一.开门见山 在前后端分离框架的大趋势下,前后端基本的职责已经确定. 前端主要负责界面的处理以及基本的判空检验.数据来源则通过vue调用后端发布的接口. 后端的原型还是mvc的模式: controll ...

  6. 汉王JAVA笔试题

    汉王JAVA笔试题 1,jsp中动态include与静态include的区别? (1)动态包含总是会检查文件中的变化,适合用于包含动态页面,并且可以带参数. (2)静态包含不会检查所含文件的变化,适用 ...

  7. shell专题(八):read读取控制台输入

    1.基本语法 read(选项)(参数) 选项: -p:指定读取值时的提示符: -t:指定读取值时等待的时间(秒). 参数 变量:指定读取值的变量名 2.案例实操 (1)提示7秒内,读取控制台输入的名称 ...

  8. [C#]正则表达式的基本用法

    C#正则表达式的基本用法 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个 ...

  9. 在Java中使用AES加密

    本文转载https://blog.csdn.net/z69183787/article/details/82746686

  10. 导出数据到Excel的时候报JAVA.LANG.NOSUCHMETHODERROR: ORG.APACHE.POI.SS.USERMODEL.CELLSTYLE.SETVERTICALALIGNMENT(LORG/APACHE/POI/SS/USERMODEL/VERTICALALIGNMENT;)V

    JAVA.LANG.NOSUCHMETHODERROR: ORG.APACHE.POI.SS.USERMODEL.CELLSTYLE.SETVERTICALALIGNMENT(LORG/APACHE/ ...