回文树
回文树是一种用来解决回文串问题的高效结构。
它类似于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号