回文树网上比较经典的模板为:Palindromic Tree——回文树【处理一类回文串问题的强力工具】,个人见过的也多为这个,网上还有一个邻接表的模板,较为省空间。原地址为回文树(附模板题URAL-1960)。回文树的有关视频讲解成电在B站的算法讲堂也有。
例题Ural1960:题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1960
题意:给定一个字符串,求每次插入一个字符输出当前的不同本质子串。
题解:毕竟裸的回文树。每次创建一个新节点就说明多了一个不同的字符串,否则就不会新建结点,考虑一开始建立了0和-1的结点,所以每次add后的p-2就是所求。
AC代码:
/*
* @Author: 王文宇
* @Date: 2018-09-03 16:43:50
* @Last Modified by: 王文宇
* @Last Modified time: 2018-09-03 21:26:55
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
const int siz = 26;
#define _for(i,a,b) for(int i=a;i<=b;i++)
struct PAM
{
int next[maxn][siz];
int fail[maxn];
int num[maxn];
int len[maxn];
int cnt[maxn];
int n,p,last,S[maxn];
int sum;
int newnode(int x)
{
_for(i,0,siz)next[p][i]=0;
len[p]=x;
num[p]=0;
cnt[p]=0;
return p++;
}
void init()
{
sum=0;
p=0;
newnode(0);
newnode(-1);
last=n=0;
fail[0]=1;