回文树
回文树是一种用来解决回文串问题的高效结构。
它类似于AC自动机,每个节点代表一种回文串,每个对应字符\(C\)的孩子即指向在它两边同时加上字符\(C\)所形成的新回文串所代表的节点,fail指针指向它的以它的右端点结束的上一个可以匹配的回文串。
详细内容:http://blog.csdn.net/u013368721/article/details/42100363
性质:
- 一个结点对应一个本质不同的回文串,位置为新建它时加入的字符右端点(一个右端点最多对应一个本质不同的回文串)
- 一个结点遍历它fail树上的所有父亲,得到所有以它右端点结束的回文串
代码:
struct Node{
    Node *f,*ch[maxc];
    int len,id; //对应长度,下标
    Node(int l,int d)
    {
        len=l,id=d,f=NULL;
        rep(i,1,maxc-1) ch[i]=NULL;
    }
} *eve,*odd,*l,*o;
void addedge(int x,int y)
{
    E[++Esize]=(Edge){y,last[x]},last[x]=Esize;
    E[++Esize]=(Edge){x,last[y]},last[y]=Esize;
}
void insert(int n,int c)
{
    while (s[n]!=s[n-l->len-1]) l=l->f;
    if (l->ch[c]==NULL)
    {
        l->ch[c]=new Node(l->len+2,++size);
        o=l->f;len[size]=(LL)(l->len+2);
        while ((o!=NULL)&&(s[n]!=s[n-o->len-1])) o=o->f;
        l->ch[c]->f=(o==NULL)?(eve):(o->ch[c]);
        
        addedge(l->ch[c]->id,l->ch[c]->f->id); //建fail树
    }
    l=l->ch[c];
    ++cnt[l->id];
}
int main()
{
    eve=new Node(0,0);odd=new Node(-1,1);eve->f=odd;l=eve;
    size=1;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号