回文树是一种强大的回文字符串处理算法,他的构造过程实际上和KMP多少有些相似,这里https://blog.csdn.net/u013368721/article/details/42100363,讲的很是仔细。
下面摘录几个例题。
URAL 1960 Palindromes and Super Abilities
每次加一个新节点,说明了有一个新的回文串产生。这个感觉真的很重要啊……我们在自动机里记录一下就好
URAL 2040 Palindromes and Super Abilities 2
和上面的题,让add函数,返回是不是产生了新的串,出题人卡输出也是经典
BZOJ 3676 回文串
长度乘以次数,次数首先要向父节点更新,为什么呢。首先子节点是父节点扩展来的,子节点扩展的相当于是从一个小的的回文串,添加了字符,变成了大的回文串。说明子串出现的得次数需要向父串传递(fail)
HYSBZ 2160 拉拉队排练
求出前k长的奇数长度回文子串,对他们的长度求乘积。
所有的意味着我们要把每个节点代表的唯一字符串的长度和出现的次数都处理出来,这道题有点卡常……
HDU 5658 CA Loves Palindromic
这道题数据范围很小,我们只要把每一个询问暴力都处理出来就行,我们让自动机的add函数返回当前添加过字符后,自动机位置上有的多少个回文串。
HDU 5157 Harry and magic string
求出不相交的回文串有多少对
首先,我们反着添加一下,让add返回当前位置的回文串个数num,顺便求一个后缀和,这样就相当于处理出了每个位置右边有多少个回文串,然后我们正着添加一下,这样左边的和右边的乘一下就是答案,求和就ok、
CodeForces 17E Palisection
处理回文串的前后缀和也是一类经典问题,这道题要我们求出相交的回文串的个数。
我们可以利用上面的办法,通过所有的回文串对数 - 不相交的对数来求最后的答案,卡内存……
【ACM|回文树(自动机)(练习和总结)】HYSBZ 2565 最长双回文串
把一个串劈开,左右两边是回文串的最长字串
可以想到枚举分割点,那么我们建两个自动机(应该是建两次,偷了个懒),一个是正向插入,一个是反向。这两个自动机都维护一个这个回文串能向左延伸的长度。反向的就是向右,然后枚举分割点判断下就ok
HDU 5421 Victor and String
维护一个可以两边都可以添加的回文自动机,那么我们首先要解决这么几个问题:
last指针的位置:我们开两个变量存,代表两边构造到了什么位置
fail的寻找,由于我们分成了左右,相当于是从中间向左向右找,这个时候就需要一个辅助变量tot来记录构造到的位置,方便我们进行寻找。
左右两边的影响:在一边添加实际上会影响到另一边的指针,我们利用上面的tot变量判断左右两边是不死连在一起。
#include
#include
#include
#include
#include
#include
#include
#include
#include
推荐阅读
- ACM|HDU 5322 Hope (CDQ分治+NTT)
- 牛客算法周周练15——A、B
- Codeforces Round #609 (Div. 2)——C. Long Beautiful Integer(思维)
- FZU - 2107题解
- ACM OJ 2036 多边形面积计算
- #|【牛客】牛客练习赛67-E-牛妹游历城市——位运算优化
- acm|扩展欧几里德算法(附证明)
- ACM|[dsu] codeforces 375D. Tree and Queries
- ACM|codeforces 732-D. Exams (二分)