[题解向] PAM简单习题
\(1\) LG5496 【模板】回文自动机
对于 \(s\) 的每个位置,请求出以该位置结尾的回文子串个数。
\(|s|\leq 1e6\)
然后就是PAM的板子题咋感觉好像没有不是很板的PAM题呢
考虑对自动机上每个点维护一个出现次数\(cnt\),那么考虑串里面的任何一个前缀的回文后缀都是其最长回文后缀的回文后缀,所以就可以有转移
\]
然后就没有然后了。
\(2\) [APIO2014]回文串
给你一个由小写拉丁字母组成的字符串\(s\)。我们定义\(s\)的一个子串的存在值为这个子串在 \(s\)中出现的次数乘以这个子串的长度。
对于给你的这个字符串\(s\),求所有回文子串中的最大存在值。
\(|s|\leq 1e6\)
感觉还是比较妙的……或许也算是PAM的基本操作,就是求出每个回文子串的出现次数。考虑一个子串出现第\(t\)次的时候(\(t>1\)),一定是作为其他串的回文后缀出现,而显然“串的最长回文后缀唯一”的逆命题“任何串会唯一作为其他串的最长回文后缀”也是成立的。故若记录以\(u\)为\(fail\)的所有子串集合为\(\rm S(u)\),那可以直接用
\]
其中ctn为单独出现的次数,因为可能有多个子串\(s\)都不作为其他串的最长回文后缀。
emmm一句话概括,PAM处理子串问题的时候有个特性,就是由于是递减式查询,所以一个回文串不会同时作为回文串和其他串的最长回文后缀出现。
for (int i = P.sz ; i ; i --)
P.f[P.pre[i]] += P.f[i], ans = max(ans, 1ll * P.len[i] * P.f[i]) ;
哪那么多P话,就是背啊
\(3\) LG5555 秩序魔咒
求两个串的最长公共回文子串以及该长度的出现次数。
\(\rm |S|,|T|\leq 10^6\)
恭喜发现一个新套路
观察起始\(\rm PAM\)本身是一棵树,添上了一堆奇奇怪怪的\(fail\)边才变成有向图。所以考虑,如果从奇根或者偶根同时向下dfs,走同样的转移边,那么一定可以到达同样的状态。所以考虑建两个\(\rm PAM\),一起dfs,然后算个答案即可。
void dfs(int x, int y){
if (ans == P.len[x]) res ++ ;
else if (ans < P.len[x]) res = 1, ans = P.len[x] ;
for (int i = 1 ; i <= 26 ; ++ i)
if (P.trie[x][i] && Q.trie[y][i])
dfs(P.trie[x][i], Q.trie[y][i]) ;
}
By the way,奇根/偶根都要\(dp\)一次。
\(4\) [JSOI2013]快乐的 JYY
求两个串的不同公共回文串的个数,其中不同意思是下标不同。
\(|s|,|t|\leq 10^6\)
……然而这就是前两个题结合起来。考虑先\(dp\)一遍算出来每个回文子串的出现次数,然后dfs,乘法原理计数,然后就做完了。
void dfs(int x, int y){
if (x + y > 2) ans += 1ll * P.f[x] * Q.f[y] ;
for (int i = 1 ; i <= 26 ; ++ i)
if (P.trie[x][i] && Q.trie[y][i])
dfs(P.trie[x][i], Q.trie[y][i]) ;
}
int main(){
P.Init(), Q.Init() ;
cin >> (S + 1) >> (T + 1) ;
N = strlen(S + 1), M = strlen(T + 1) ;
for (int i = 1 ; i <= N ; ++ i) P.Insert(S[i] - 'A' + 1, i, S) ;
for (int i = 1 ; i <= M ; ++ i) Q.Insert(T[i] - 'A' + 1, i, T) ;
for (int i = P.sz ; i ; -- i) P.f[P.pre[i]] += P.f[i] ;
for (int i = Q.sz ; i ; -- i) Q.f[Q.pre[i]] += Q.f[i] ;
dfs(1, 1) ; dfs(0, 0) ; cout << ans<< endl ; return 0 ;
}
\(5\) 闲扯
写模板题真是让人感到空虚……
[题解向] PAM简单习题的更多相关文章
- [题解向] Manacher简单习题
\(1\) LG1659 [国家集训队]拉拉队排练 求前\(k\)大的奇数长度回文串的长度之积. \(\rm |S|\leq 1e6,K\leq 1e12\) --一开始觉得挺水,就开始二分最少长度能 ...
- [题解][YZOJ50104] 密码 | 简单计数
同步发表于 Mina! 题目大意 对于满足以下要求的长度为 \(n\) 的序列进行计数: 序列的值域为 \([1,k]\); 对于序列的任意位置 \(p\in[1,n]\),可以找到至少一个 \(i\ ...
- python学习日记(2/3区别,环境,变量,数据类型以及简单习题)
Python2 与 python3 的区别: python2源码不标准,混乱,重复代码太多 python3统一标准,去除重复代码 python2的默认编码方式是ASCII码,不能识别中文.解决方法:在 ...
- Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)
这次接触到记忆化DFS,不过还需要多加练习 113. 路径总和 II - (根到叶子结点相关信息记录) """ 思路: 本题 = 根到叶子结点的路径记录 + 根到叶子结点 ...
- Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)
树的题目中递归用的比较多(但是递归是真难弄 我
- 关于java基础_方法的简单习题
package day05; import java.util.Arrays; /** * 方法作业 * @author ASUS * */ public class Demo6 { /* * 1.定 ...
- PAM学习小结
PAM 目录 PAM 功能: 回文树 Fail指针 Trans指针 构建PAM 应用 P5496[模板]回文自动机(PAM) P4287[SHOI2011]双倍回文 P4555[国家集训队]最长双回文 ...
- Linux UserSpace Back-Door、Rootkit SSH/PAM Backdoor Attack And Defensive Tchnology
catalog . 引言 . Pam后门 . SSH后门 . Hijacking SSH . Hijacking SSH By Setup A Tunnel Which Allows Multiple ...
- 《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题
这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就 ...
随机推荐
- Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案
一.Error LNK2019: 无法解析的外部符号 此问题应该是Visual Studio的初学者最常碰到的问题,也是相对来说很让人头疼的问题. 注:Error LNK2019 问题在VC 6.0 ...
- PWA 学习笔记(三)
基础技术简介 Promise: 1.ES6 引入的一种异步编程的解决方案,通过 Promise 对象来提供统一的异步状态管理方法 2.一般在使用 Promise 对象的时候,首先需要对其进行实例化 3 ...
- 阿里云ECS服务器部署HADOOP集群(五):Pig 安装
本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 1 环境介绍 一台阿里云ECS服务器:master 操作系统:CentOS 7.3 Hadoop ...
- python 爬虫 随机换user-agent
USER_AGENTS = [ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like ...
- Fiddler之模拟响应、修改请求或响应数据(断点)
在测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以使用fiddler进行此类操作.可以使用断点功能完成. 一.修改请求数据 在发起请求后,需要修改请求的数据时,可以设置请求前 ...
- 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)
点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...
- laravel实现多模块
一.这里使用Caffienate Modules 网址:modules maintained by caffeinated 二.根据自己的版本选择包的版本 三.在项目composer.json文件中加 ...
- Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)
树的题目中递归用的比较多(但是递归是真难弄 我
- windows本地连不上虚拟机redis服务完美解决
检查本机与虚拟机是否可以互相ping通,如本机IP:192.168.22.111 虚拟机IP:192.168.44.129 (设置虚拟机静态IP已设置) 本机 win+R 输入cmd 进入dos 输 ...
- Python 从入门到进阶之路(七)
之前的文章我们简单介绍了一下 Python 中异常处理,本篇文章我们来看一下 Python 中 is 和 == 的区别及深拷贝和浅拷贝. 我们先来看一下在 Python 中的双等号 == . == 是 ...