首先,回文树有何功能?
假设我们有一个串S,S下标从0开始,则回文树能做到如下几点:
1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同)
2.求串S内每一个本质不同回文串出现的次数
3.求串S内回文串的个数(其实就是1和2结合起来)
4.求以下标i结尾的回文串的个数
模板:
1 | const int MAXN = 100005 ; |
例题1.BZOJ3676
题意
求一个字符串中所有回文子串的出现次数与长度乘积的最大值
1 |
|
例题2 UVA7041
题意
给出两个仅包含小写字符的字符串 A 和 B ;
求:对于 A 中的每个回文子串,B 中和该子串相同的子串个数的总和。
从0和1两个根节点DFS下去,如果两个相同的节点同时存在就统计答案。
1 |
|
例题3ACM-ICPC 2018 南京赛区网络预赛 Skr
题意
给出一个数字串,求其本质不同的回文子串的和。
在回文树建立的过程中自带去重,所以只需要跑一遍记录答案就好了。
奇根下直接连接的节点所代表的的都是单个字符的回文串,其他都是在两边加上同一个字符,用这个规律去生成数字求和就好了。
1 |
|
例题4 HIHO#1602 : 本质不同的回文子串的数量
给定一个字符串S,请统计S的所有子串中,有多少个本质不同的回文字符串?
1 | cin>>s; |