【模板】回文树

#include <bits/stdc++.h> 
using namespace std;
#define N 500010
int nxt[N][26],tot=1,fa[N]={1,1},last,n;
long long size[N],len[N]={0,-1}; char str[N];
void insert(int x,int now)
{
    int p=last;  
    while(str[now-len[p]-1]!=str[now]) p=fa[p];   
    if(!nxt[p][x])
    {
        int q=fa[p]; while(str[now-len[q]-1]!=str[now]) q=fa[q];
        fa[++tot]=nxt[q][x],nxt[p][x]=tot,len[tot]=len[p]+2;
    } 
    last=nxt[p][x],size[last]++;
}
int main()
{
    scanf("%s",str+1),n=strlen(str+1);
    for(int i=1;i<=n;i++) insert(str[i]-'a',i); 
    for(int i=tot;i>1;i--) size[fa[i]]+=size[i];

}
回文树

 

posted @ 2019-09-28 10:17  Dorom  阅读(107)  评论(0)    收藏  举报