\(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. [转]UiPath Keyboard Shortcuts

    本文转自:https://docs.uipath.com/studio/docs/keyboard-shortcuts The complete list of keyboard shortcuts ...

  2. 2019 DevOps 必备面试题——容器化和虚拟化

    原文地址:https://medium.com/edureka/devops-interview-questions-e91a4e6ecbf3 原文作者:Saurabh Kulshrestha 翻译君 ...

  3. Git仓库分支管理

    #前提条件:#一.使用命令“cd /d/BranchMgr”进入到需要进行分支管理的仓库的目录,“/d/BranchMgr”是仓库路径.如下图: ”Administrator@DESKTOP-VL6G ...

  4. 跨平台版本迁移之 XTTS 方案操作指南

    本文转自 https://blog.csdn.net/Enmotech/article/details/80045576 作者 | 罗贵林: 云和恩墨技术工程师,具有8年以上的 Oracle 数据库工 ...

  5. 编译出错:must be index or base register

    指令 mov ds:[dx],dx 原因:上述指令使用寄存器相对寻址方式,只能使用BX,BP,SI,DI 方括号里必须是变址(index,指SI, DI)或基址(base,指BX, BP)寄存器 正确 ...

  6. 菜鸟刷面试题(三、Redis篇)

    目录: redis是什么?都有哪些使用场景? redis有哪些功能? redis和memecache有什么区别? redis为什么是单线程的? 什么是缓存穿透?怎么解决? redis支持的数据类型有哪 ...

  7. mysqlbinlog-Note

    binlog_format = mixedlog-bin = /data/mysql/mysql-binexpire_logs_days = 7 #binlog过期清理时间max_binlog_siz ...

  8. Go 数组(array) & 切片(slice)

    数组 数组是一组固定长度的序列 数组类型 数组的类型不仅和储存元素的类型有关,还和数组长度有关,不同长度的数组是不同的类型 不同类型的数组不能共用一个函数 func main() { var a [1 ...

  9. Java内存分析工具MAT

    MAT是一个强大的内存分析工具,可以快捷.有效地帮助我们找到内存泄露,减少内存消耗分析工具.内存中堆的使用情况是应用性能监测的重点,而对于堆的快照,可以dump出来进一步分析,总的来说,一般我们对于堆 ...

  10. 01-Vue.js基础

    一.Vue基础 1.介绍 Vue是一套用于构建用户界面的渐进式框架.Vue的核心库只关注视图层,不仅容易上手,还便于与第三方库或既有的项目整合.兼容性:Vue 不支持 IE8 及以下版本,因为 Vue ...