\(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. vue - Error: Can't resolve '@/assets/img/github.svg (vue-cli3.0,无法解析.svg图片,已解决)

    用vue脚手架(vue-cli3.0)生成的目录,无法解析.svg图片的问题 <img src="@/assets/img/github.svg" alt="git ...

  2. ActiveMQ下载与安装(消息中间件JMS)

    下载 官方网站下载:http://activemq.apache.org/ 1.3.2安装(Linux) (1)将apache-activemq-5.12.0-bin.tar.gz 上传至服务器 (2 ...

  3. MAC下安装pomelo

    配置:OS X 10.9.4 + Xcode 6.0 摘要:本文目标为成功运行pomelo的HelloWorld程序.   壹.| 安装必要项   一.安装Xcode及相关工具 1.安装Xcode. ...

  4. 【RTOS】基于V7开发板的RTX5和FreeRTOS带CMSIS-RTOS V2封装层的模板例程下载,AC6和AC5两个版本

    说明: 1.使用MDK的RTE环境开发RTX5和FreeRTOS,简单易移植,统一采用CMSIS-RTOS V2封装层. 2.DTCM是H7里面性能最高的RAM,主频400MHz,跟内核速度一样,所以 ...

  5. 再次梳理AMD、CMD、CommonJS、ES6 Module的区别

    AMD AMD一开始是CommonJS规范中的一个草案,全称是Asynchronous Module Definition,即异步模块加载机制.后来由该草案的作者以RequireJS实现了AMD规范, ...

  6. JavaScript -- 筑基

    本片博客记录了我JavaScript筑基阶段的学习内容,JavaScript不是Java,但是我下意识的把它和java对比学习,有些地方比较有趣,有些地方从java角度看,简直匪夷所思,不过现在总体感 ...

  7. 好看的鼠标hover效果

    0919自我总结 常见的鼠标hover效果 展示效果:http://ianlunn.github.io/Hover/ 部分动画制作 <style><!-- .container { ...

  8. SQL实用技巧:如何将表中某一列的部分数据合并到一行中

    select *,stuff(select ‘,’ + fieldname from table1 for xml path(”)),1,1,”)  as  field from table2 for ...

  9. html-css___table属性(设置细线边框)

    border-collapse 属性设置表格的边框是否被合并为一个单一的边框 //设置table实线边框 table,td{ /*边框合并*/ border-collapse: collapse; b ...

  10. ABP入门教程12 - 展示层实现增删改查-脚本

    点这里进入ABP入门教程目录 创建目录 在展示层(即JD.CRS.Web.Mvc)的\wwwroot\view-resources\Views\下新建文件夹Course //用以存放Course相关脚 ...