学习笔记 回文树

回文树,也叫回文自动机(PAM)。是OI中一种常用的自动机,用来处理子串回文并相互有联系的一类问题。

1.回文树的建立

struct Tries{
	int ch[27],fail,len,sum;
} T[N];
int siz,lastans,cur,cnt=1;
char str[N];

回文树是建立在字典树Tries上的一种自动机,类似AC自动机,也需要有fail指针(至于它的具体含义见下)。

而回文树的每个节点是一个子串,不再是一个字符。

它的每条边代表一个字符,从上往下走表示在父亲的子串两端各加一个边上的字符。

同时,回文树也有两个根,奇根和偶根。

初始化(奇根=1,偶根=0):

T[1].len=-1,T[0].len=0;//1 为奇根,0为偶根
	T[1].fail=0,T[0].fail=1;//相互指,方便跳,因为任何串都满足奇根
	//至于奇根的fail是为了get_fail

原因:如果你写过马拉车都学回文树了肯定会manacher啊qwq

那么你肯定知道回文串分为奇数长度和偶数长度。

这两种串区别很明显,而它们分别对应奇数和偶数。

len存当前节点的长度,sum存个数。

cur代表上一个建立(访问)的节点,这个也很重要。

2.回文树的维护

fail指针的含义:当前节点的最长回文后缀。(注意是回文后缀)

inline int get_fail(int cur,int now)
{
	while(str[now-T[cur].len-1]!=str[now]) cur=T[cur].fail;
	return cur;
}

暴力跳就可以我不知道有没有用并查集维护这个东西的((

咕咕咕咕qwq