后缀自动机的构造
这几天一直在看关于后缀自动机的资料,发现这真的是一个优美的算法,先贴一段构造的核心代码吧
inline void add(int x)
{
int now=last,nv=last=++tot;siz[nv]=1;
a[nv].len=a[now].len+1;
for(;now!=-1&&!a[now].ch[x];now=a[now].fa) a[now].ch[x]=nv;
if(now==-1) a[nv].fa=0;
else
{
int now1=a[now].ch[x],clone;
if(a[now1].len==(a[now].len+1)) a[nv].fa=now1;
else
{
clone=++tot;//a[clone]=a[now1];
memcpy(a[clone].ch,a[now1].ch,sizeof(a[now1].ch));
a[clone].fa=a[now1].fa;
a[clone].len=a[now].len+1;
a[now1].fa=a[nv].fa=clone;
for(;now!=-1&&a[now].ch[x]==now1;now=a[now].fa) a[now].ch[x]=clone;
}
}
}
此前我不理解主要是复制节点的部分,我现在的建议是结合画图理解,可以以aababa为例,因为这个数据包含了所有情况。
后缀自动机的应用
详细的推荐洛谷P3804的第一篇,讲得真的很好…