回文自动机 笔记

本文详细介绍了回文自动机的概念,包括它的基础题型、构建方法和fail指针的证明。通过实例展示了如何构建回文自动机,并探讨了其实现与应用场景,如计算本质不同的回文串个数。
摘要由CSDN通过智能技术生成

今天日常给同学@CollinGao 写奥♂义。讲到了这个东西,还是挺有用的,就是有点毒瘤?仿佛没什么人知道的亚子。。。

不是很难理解的算法,我在期中考试考场上就直接yy出了一个来。虽然马上CSP了,但是我还是准备来颓废,写写这篇奥♂义。

基础题型

给你一个字符串,对于每个前缀,求该前缀中有多少前缀不同的回文子串。定义一个回文子串的权值为:长度乘以出现次数。对于每个前缀,也请你求出最大的回文子串的权值是多少。

回文自动机(又名回文树)是干啥的

大家都知道TRIE树(知道即珂,但是如果连听说都没听说过,那劝退了)。在TRIE树上,每个节点表示一个字符串,字符记录在边权上。连一条边表示在这个字符串后面加上一个字符。

那么,回文自动机是怎么弄的的?连一条边,表示在这个字符串前后各加上一个字符。比如某个父亲的字符串为"aba",连了一条权值为’c’的边到儿子,儿子的字符串就是"cabac"。

然后要注意一点,回文自动机有两个根。其原因很显然,因为一个父亲以下的字符串长度的奇偶性不会改变。所以,两个根分别记录奇数长度和偶数长度的回文串,名字就叫奇根和偶根。偶根很好理解,表示一个空串,其长度为 0 0 0。那么,奇根怎么办呢?仔细一推,单个字符长度为 1 1 1,其父亲的长度为其长度 − 2 -2 2,也就是说,奇根表示的字符串长度为 − 1 -1 1?!

没事, − 1 -1 1 − 1 -1 1,只不过是为了方便计算罢了。实际实现中,考虑到空间问题,我们并不会实际记录表示的字符串,只是记录一个长度 l e n len len。那么,只要让这个点的 l e n = − 1 len=-1 len=1即珂,一点问题都没有。

fail指针

精髓(准确来讲,是每个自动机的精髓)。对于一个节点,它的 f a i l fail fail指针是指:除了自己之外,LPS(Longest Palindrome Suffix,最长回文后缀)所对应的点。
如果你仔细咀嚼了这句话,那么你会想这样一个问题:除了自己之外的最长回文子串一定在树上能找到吗?

证明fail一定在树上能找到

(如果您能自己证明,请跳过这段)
设当前节点表示字符串 s s s f a i l fail fail指向的节点所对应为 f f f f t f^t ft表示把 f f f反过来, ∣ f ∣ |f| f表示 f f f的长度,如图所示。

由于 S S S是回文串(根据定义), S S S的前缀 ∣ f ∣ |f| f个字符串和后缀 ∣ f ∣ |f| f S S S f f f都是回文的,非常容易证明, S S S ∣ f ∣ |f| f个前缀和这么长的后缀是一样的。
那么, f f f在后面出现一遍,就说明在前面也出现了一遍。由于我们是从前往后加入到树上的,所以这个串一定能找到。

证毕 ■ \blacksquare

如何构建

上面讲了一下,我们是按照从前往后的顺序插入 s s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值