回文树,也叫回文自动机(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