//我真的没有口吃,标题里的第一个后缀自动机是题目名称,第二个是解决问题用的算法
1. 题目
2. 题解
OvO 模板题做到要崩溃
好吧不吐槽了
自动机上每个点对应了一个 endpos集合,也对应了一个字符串集合 S,集合 S里的字符串在原串中的结尾位置都在且仅在 endpos集合中
因此我们只需要维护 |endpos|(endpos集合大小)和 S中最长字符串长度。
答案就是对于 |endpos|>1的点,它们的 |endpos|×maxlen的最大值
具体就是在 pre树上 Dp 一波,pre树上的点对应的 endpos就是其树上儿子的 endpos的并(实际上 pre树上的兄弟的 endpos集合并不会有交集,因为 endpos有交集说明其中一个是另一个的后缀,那么它们在 pre树上应当是父(祖先)子关系)
然后插入的时候每个新插入的那 n个点本身初始 endpos大小为 1(因为它在插入时是当前最长的字符串)
再树型 Dp 计算一下子树 size就行了
具体看代码吧,还是比较简单的。。。
我一开始是对 SAM 认知不足,以为新插入的那 n个点就是 pre树的叶子节点。。。然而其实并不是。。。比如插入的字符串是 aba
,其中第一个 a
所代表的节点就不是叶子节点。。。
0 条评论