PAM学习笔记
想了想 还是要先把字符串的东西先都学完告一段落了再说 时间不多了 加油~。
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学习笔记的更多相关文章
- 回文树/回文自动机(PAM)学习笔记
回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的 ...
- C++学习笔记(2)
本学习笔记是C++ primer plus(第六版)学习笔记.是C++学习笔记(1)的后续.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p ...
- Beego学习笔记——Logs
日志处理 这是一个用来处理日志的库,它的设计思路来自于database/sql,目前支持的引擎有file.console.net.smtp,可以通过如下方式进行安装: go get github.co ...
- 后缀自动机&回文自动机学习笔记
在学了一天其实是边学边摆之后我终于大概$get$后缀自动机了,,,就很感动,于是时隔多年我终于决定再写篇学习笔记辽$QwQ$ $umm$和$FFT$学习笔记一样,这是一篇单纯的$gql$的知识总结博, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
随机推荐
- 通过原生js对DOM事件的绑定的几种方式总汇
在网页开发中经常会有交互操作,比如点击一个dom元素,需要让js对该操作做出相应的响应,这就需要对Dom元素进行事件绑定来进行处理,js通常有三种常用的方法进行事件绑定:在DOM元素中直接绑定:在Ja ...
- Apache Hudi重磅特性解读之全局索引
1. 摘要 Hudi表允许多种类型操作,包括非常常用的upsert,当然为支持upsert,Hudi依赖索引机制来定位记录在哪些文件中. 当前,Hudi支持分区和非分区的数据集.分区数据集是将一组文件 ...
- python入门007
一.深浅copy 浅拷贝:是把原列表第一层的内存地址完全拷贝一份给新列表.即只能保证对原列表中第一层地址(不可变类型)的改操作不受影响,涉及到原列表中第二层地址(可变类型)的改操作时,原列表变,新列表 ...
- WPF手机号码归属批量查询并导出到Excel
工具下载地址:https://download.csdn.net/download/m0_37137902/12589801 1WPF页面xaml代码 <Window x:Class=" ...
- 数据可视化之分析篇(十)Power BI应用:如何计算在职员工数量?
https://zhuanlan.zhihu.com/p/128652582 经常碰到的一类问题是,如何根据起止日期来计算某个时间点的数量,比如: 已知合同的生效日期和到期日期,特定日期的有效合同有 ...
- Presto原理及安装
背景 MapReduce不能满足大数据快速实时adhoc查询计算的性能要求,Facebook2012年开发,2013年开源 是什么 基于内存的并行计算,Facebook推出的分布式SQL交互式查询引擎 ...
- JavaScript 基础 学习 (一)
JavaScript 基础 学习 获取页面中的元素的方法 作用:通过各种方式获取页面中的元素 比如:id,类名,标签名,选择器 的方式来获取元素 伪数组: 长的和数组差不多,也是按照索引排 ...
- Go Pentester - HTTP CLIENTS(1)
Building HTTP Clients that interact with a variety of security tools and resources. Basic Preparatio ...
- Ethical Hacking - GAINING ACCESS(24)
CLIENT SIDE ATTACKS - Detecting Trojan manually or using a sandbox Analyzing trojans Check the prope ...
- OSCP Learning Notes - WebApp Exploitation(5)
Remote File Inclusion[RFI] Prepare: Download the DVWA from the following website and deploy it on yo ...