struct palindrome_tree{
int fail[N],to[N][27],len[N],cnt[N],lst;
void build() {
len[0]=0;fail[0]=1;
len[tot=1]=-1;
}
int get(int n,int x) {
while (S[n-len[x]-1]!=S[n]) x=fail[x];
return x;
}
int add(int n,int x) {
int now=get(n,lst);
if (!to[now][x]) {
len[++tot]=len[now]+2;
fail[tot]=to[get(n,fail[now])][x];
to[now][x]=tot;
}
lst=to[now][x];
cnt[lst]++;
return lst;
}
void count() {fd(i,tot,1) cnt[fail[i]]+=cnt[i];}
}tr;
还是用0号点比较好,用数据结构维护的时候多注意一下。