后缀自动机【TAT】

 

题目来源由于之前我懒没写博客以至于花了大量时间来复健。

从后缀自动机起点开始,走出来的任何串都是原串后缀。从任何一个节点开始,走出来的串合起来就是所有子串。

一个后缀自动机上的结点指其endpos集合相同的一坨字符串。体现在从起点走到该点的所有串集合上。

我们假设一个变量maxlen为该集合的最长子串长度。

我直接说建造过程,就不管看不看得懂了。

首先,新建点u继承上一个点的信息,len+1;

其次,在满足没有儿子u的情况下,将上一个点跳fail,途径结点该儿子设为u

如果跳到了根节点,就结束了

反之,说明有点t有u儿子q。

如果该儿子q长度是t的+1,则合法,直接将u的fail设为q

反之,说名end集合不合法,新增克隆点tem。继承q的信息,将q和u的fail均设成tem,将tem的len设为t+1。

然后,t跳fail,将所有有u儿子的设为tem。完了

然后性质

反向fail树,子树size表示该点字符串出现次数。

任意结点代表end集合中没有长度相同的字符串,且字符串长度相邻递增。

也就是说我的len减去我fail的len可以得到我所代表的的子串数量。

ch形成dag(废话)

fail树上两点LCA表示最长公共后缀。(所以求最长公共前缀可以把串反向)

求第k大子串直接dag上动规。如果相同子串算不同次数也可以先fail树算贡献再动规。

spoj1811 LCS 

spoj1812 LCS2 

bzoj2882/洛谷1368 工艺 

bzoj3998/洛谷3975 [TJOI2015]弦论

spoj8222 Substrings

洛谷P3804【模板】后缀自动机 

bzoj4516/洛谷P4070 [Sdoi2016]生成魔咒

bzoj4566/洛谷3181 [Haoi2016]找相同字符 

bzoj2555 SubString 

bzoj3238/洛谷4284 [Ahoi2013]差异 

bzoj3676/洛谷3649 [Apio2014]回文串 

  •  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值