SAM,ACAM,PAM 辨析

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

正题

      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)

      一般使用基数排序,将所有元素从浅到深写出来,注意虽然是稳定排序,但是相同权值的元素相对于原来之前是倒序.

      后续也许会更

      

      

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值