译名为“回文树”,是一种专门处理回文串的数据结构,类似于马拉车,但更为强大。是由两颗分别存储偶数回文串树和存储奇数回文串树组成,每个节点代表母串的回文串,两树之间中用fail指针连接。
struct Palindromic_Tree{ int next[N][30]; //节点之间连边 int fail[N]; //适配指针 表示当前回文串的最长回文后缀 int len[N]; //当前回文串的长度 int cnt[N]; //回文串的个数 int id[N]; //回文串的右端点 int S[N]; int last,n,p; int newnode(int l){//新建节点 for(int i=0;i<26;i++) next[p][i]=0;//新建的节点为p,先消除它的子节点 cnt[p]=0; len[p]=l; return p++;//勿打成++p,因为此节点为p,我们应返回p } void init(){ last=n=p=0; newnode(0); newnode(-1); S[0]=-1; fail[0]=1; } int get_fail(int x){ while(S[n-len[x]-1]!=S[n]) x=fail[x]; return x; } void add(int c){ c-='a'; S[++n]=c; int po=get_fail(last); if(!next[po][c]){ int now=newnode(len[po]+2); fail[now]=next[get_fail(fail[po])][c]; next[po][c]=now; } last=next[po][c]; cnt[last]++; id[last]=n; } void count(){ for(int i=p-1;i>=0;i--) cnt[fail[i]]+=cnt[i]; } }pat;