别的都挺好理解的
难以理解的那个地方还是clone节点的问题
这里给一个非常好的例子
asabab
对这个字符串建立后缀自动机
会在最后一个字符的时候出现克隆节点的情况
仔细画一遍parent树应该就能理解了
克隆节点的意义实际上是为了把原本的一个节点拆为两个节点
为什么要拆呢
因为字符串末尾新增一个字母后
产生了一些新的子串
这些子串有的在之前出现过
然后使得有些子串的endpos集合发生了改变
某些节点中
并不是所有的串的endpos都改变了
此时便不能再只用一个节点来表示这些子串
因此需要拆点
后缀自动机基础习题
1.检查模式串是否出现
沿着SAM的转移边跑一遍即可,如果最后没有到达空节点,则说明字符串出现
2.计算模式串出现次数
builds时令所有cnt[cur]=1
然后parent树上节点x对应字符串的出现次数记为子树和
用到的性质:
1.x的儿子之间的endpos集合时无交集的
2.前缀i和前缀j对应的节点一定不是同一个节点