正题
SAM,Suffix AutoMaton,后缀自动机,可以识别每一个后缀,拥有多个结束点,实际上可以识别所有的子串,所以我更愿意将它理解为子串自动机
ACAM,Aho-Corasick AutoMaton,AC自动机,可以识别所有串的前缀,所以我更愿意将它理解为它前缀自动机.
PAM,Palindrome AutoMaton,回文自动机,可以识别该串的所有回文子串.
同类型名称辨析
点
SAM上的一个点对应着一个等价类,这个等价类记录的是一群结束位置集合相等,长度连续的子串.
ACAM上的一个点对应着一个等价类,这个等价类记录的是一个串或多个串的公共前缀
PAM上的一个点对应着一个等价类,这个等价类记录的是在一个或多个位置出现的回文子串
他们的点数都是O(n)级别的,其中SAM有两倍常数,PAM多加两个点
三个自动机上的节点所管理的东西都是互异的,所以可以的出类似"本质不同"的答案.常常用此来去重.
转移边
SAM上的一条转移边表示在这个点所代表的所有子串后面加上一个字符c,会转移到的等价类.
ACAM上的一条转移边表示这个点所代表的前缀后面加上一个字符c,会转移到的最大前缀.
PAM上的一条转移边表示这个点所代表的回文子串的两边加上一个字符c,会转移到的对应回文子串
endpos集合
三个自动机的endpos集合都指的是该点所代表的子串的出现位置.
fail指针
SAM上的fail指针指向的是该点对应子串的最长真后缀所在的等价类.
ACAM上的fail指针指向的是该点对应前缀的后缀所在的点,这个后缀必须满足是多串的某个前缀,并且最长
PAM上的fail指针指向的是该点对应回文子串的最长回文后缀所在的点.
明显三个fail指针指向的都是本身的子串,所以在fail树上,儿子出现过的位置,祖先也一定出现过,所以就可以用线段树合并来维护每个点的endpos集合,当然既然说到有根树了,那么跟树有关的维护操作都可以考,像虚树,树形Dp,dfs序......这个尽量不要口胡,多做点题才会明白.
len
SAM的len记录的是这个等价类中最长的串,最短的串可以由fail来得到.
ACAM也可以拥有len!记录的是表示前缀长度
PAM记录的是该点对应的回文子串长度.
注意事项
ACAM的文本串不用插入ACAM,而匹配串一定要,可以做多点题想想为啥,具体可以考虑文本串一定可以走到最大匹配前缀,而匹配串走到的可能啥都不是.
PAM要注意先找fail,再继承父子关系,还要特殊考虑奇根和偶根,以及跳fail的最终节点是奇根.
SAM实际上普通写法的时间复杂度可以去到字符集*|S|,可以利用map来优化或者哈希表,做到O(log)或者期望O(1)
一般使用基数排序,将所有元素从浅到深写出来,注意虽然是稳定排序,但是相同权值的元素相对于原来之前是倒序.
后续也许会更

本文深入探讨了三种自动机:SAM(后缀自动机)、ACAM(AC自动机)及PAM(回文自动机)的基本概念、特性及应用。详细解析了它们的点、转移边、endpos集合、fail指针及len属性,并强调了各自的注意事项。
2204

被折叠的 条评论
为什么被折叠?



