\(1\) LG5496 【模板】回文自动机

对于 \(s\) 的每个位置,请求出以该位置结尾的回文子串个数。

\(|s|\leq 1e6\)

然后就是PAM的板子题咋感觉好像没有不是很板的PAM题呢

考虑对自动机上每个点维护一个出现次数\(cnt\),那么考虑串里面的任何一个前缀的回文后缀都是其最长回文后缀的回文后缀,所以就可以有转移

\[cnt_{p}=cnt_{fail_p}+1
\]

然后就没有然后了。

\(2\) [APIO2014]回文串

给你一个由小写拉丁字母组成的字符串\(s\)。我们定义\(s\)的一个子串的存在值为这个子串在 \(s\)中出现的次数乘以这个子串的长度。

对于给你的这个字符串\(s\),求所有回文子串中的最大存在值。

\(|s|\leq 1e6\)

感觉还是比较妙的……或许也算是PAM的基本操作,就是求出每个回文子串的出现次数。考虑一个子串出现第\(t\)次的时候(\(t>1\)),一定是作为其他串的回文后缀出现,而显然“串的最长回文后缀唯一”的逆命题“任何串会唯一作为其他串的最长回文后缀”也是成立的。故若记录以\(u\)为\(fail\)的所有子串集合为\(\rm S(u)\),那可以直接用

\[\rm f_u=ctn_u+\sum_{v\in S(u)}f_v
\]

其中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简单习题的更多相关文章

  1. [题解向] Manacher简单习题

    \(1\) LG1659 [国家集训队]拉拉队排练 求前\(k\)大的奇数长度回文串的长度之积. \(\rm |S|\leq 1e6,K\leq 1e12\) --一开始觉得挺水,就开始二分最少长度能 ...

  2. [题解][YZOJ50104] 密码 | 简单计数

    同步发表于 Mina! 题目大意 对于满足以下要求的长度为 \(n\) 的序列进行计数: 序列的值域为 \([1,k]\); 对于序列的任意位置 \(p\in[1,n]\),可以找到至少一个 \(i\ ...

  3. python学习日记(2/3区别,环境,变量,数据类型以及简单习题)

    Python2 与 python3 的区别: python2源码不标准,混乱,重复代码太多 python3统一标准,去除重复代码 python2的默认编码方式是ASCII码,不能识别中文.解决方法:在 ...

  4. Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)

    这次接触到记忆化DFS,不过还需要多加练习 113. 路径总和 II - (根到叶子结点相关信息记录) """ 思路: 本题 = 根到叶子结点的路径记录 + 根到叶子结点 ...

  5. Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)

    树的题目中递归用的比较多(但是递归是真难弄 我

  6. 关于java基础_方法的简单习题

    package day05; import java.util.Arrays; /** * 方法作业 * @author ASUS * */ public class Demo6 { /* * 1.定 ...

  7. PAM学习小结

    PAM 目录 PAM 功能: 回文树 Fail指针 Trans指针 构建PAM 应用 P5496[模板]回文自动机(PAM) P4287[SHOI2011]双倍回文 P4555[国家集训队]最长双回文 ...

  8. 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 ...

  9. 《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题

    这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就 ...

随机推荐

  1. robotframework框架 - 利用RequestsLibrary关键字轻松实现接口自动化!

    robotframework(后续简称为robot)是一款自动化测试框架,可能做各种类型的自动化测试. 本文介绍通过robotframework来做接口测试. 第一步:安装第三方库,提供接口测试的关键 ...

  2. 【框架】利用Spring的BeanPostProcessor来修改bean属性

    一.BeanPostProcessor是什么?什么时候触发?可以用来做什么? 1.它是什么? 首先它是一个接口,定义了两个方法: public interface BeanPostProcessor ...

  3. Fiddler使用方法之Fiddler显示IP,Fiddler中文乱码解决方法以及Fiddler模拟发送get/post请求

    Fiddler是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动,是我们常用的抓包工具之一 今天为大家分享一下几个使用Fiddler的小技巧 一.Fiddler抓包中文乱码问 ...

  4. nginx 反向代理之 proxy_pass

    格式很简单: proxy_pass URL; 其中URL包含:传输协议(http://, https://等).主机名(域名或者IP:PORT).uri. 示例如下: proxy_pass http: ...

  5. C语言程序设计100例之(22):插入排序

    例22  插入排序 问题描述 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素或记录的任意序列,重新排列成一个以关键字递增(或递减)排列的有序序列. 排序的方法有很多,简单插入排序就是一 ...

  6. IT兄弟连 HTML5教程 HTML5表单 新增的表单属性2

    5  height和width属性 height和width属性规定用于image类型和input标签的图像高度和宽度.图像通常会同时指定高度和宽度属性.如果图像设置高度和宽度,图像所需的空间在加载页 ...

  7. MongoDB自学------(4)MongoDB主从搭建

    MongoDB复制原理 mongodb的复制至少需要两个节点.其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据. mongodb各个节点常见的搭配方式为:一主一从.一主多 ...

  8. jquery使用on()方法绑定的事件被执行多次的问题

    jQuery用on()方法绑定了事件之后,在代码执行过程中,可能会遇到事件被多次执行的情况. 本来以为是事件冒泡的问题,后来发现是on()方法的特性引起的问题. 简单还原一下问题的场景 这里简单还原一 ...

  9. SpringCloud微服务(02):Ribbon和Feign组件,实现服务调用的负载均衡

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ribbon简介 1.基本概念 Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TC ...

  10. js格式化JSON数据

    前言: 最近做的项目中遇到个需要在前端页面中将某个设备需要的数据格式展示出来,方便用户配置.一开始单纯的将数据格式写入到pre标签中, 但是通过pre标签写入的数据格式在代码可视化上不是很优雅.由于上 ...