关于后缀自动机的一些随笔

后缀自动机的构造

这几天一直在看关于后缀自动机的资料,发现这真的是一个优美的算法,先贴一段构造的核心代码吧

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的第一篇,讲得真的很好…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值