我终于学会了后缀自动机。

(没有后续,不要认真看完,参照评论区惨剧)
3个月前就说要学,结果真实拖到今天。
有些东西火候不到是真的学不会…

网上的教程不算多,而且大部分都是翻译作品,对自动机内各个部位的叫法五花八门,比如自动机里虚边,就有叫link(后缀链接),pre指针,fa数组(我真的不知道fa是什么的缩写)的,记录步数的有叫len的,step的(这俩倒是好理解),状态转移的有叫next的,叫trans的还有叫ch数组的(再次对大佬的起名能力感到震惊)。

这个东西,真是又短又美,而且功能非常强。

当然也费脑子…最后学完之后,却又感觉没那么难(你也不看看你花了几个晚上在这上面)。

还是应了那句话“这道题/这算法会了就不难了”。

学习的过程中还有一些有趣的事情,比如陈立杰的ppt里有这么一页:

这里写图片描述

先无视掉大佬自称弱菜的常规操作…最后一个Q&A引人注目,特别是在我三个月前大量搜集资料打印的时候看到了这么一个上古博客:

这里写图片描述

破案了!原来睡觉的是这位大佬!
等等!他做个梦就懂了?我怎么做不了梦???

不讲笑话了,为了让路过的各位(大概没几个路过吧…)不白来看我吐槽,我还是分享一点心得。

经过我这几天的研究,我深刻感受到了后缀自动机的重点并不在于那些秀得瞎眼的操作,整个后缀自动机最关键的思想很可能跟可持久化数据结构一样,关键在于大量的空间重用!

也就是,如无必要,勿增实体。

而线性构造后缀自动机的算法,很有可能是这种思想的副产物。

也许科学家们也没有我想的那么强,可能他只是想压缩一下字典树才提出的后缀自动机而已,然后后来又一拍脑袋,哎这么搞顺便还能搞个O(n)的算法出来,老强了!于是才有了这么玄奥的东西。

(说实话还真有可能,后缀自动机这个东西的论文发表后好几年,才有人提出了线性的构建方法,一开始的自动机是什么样的?嘛,谁知道呢)

举个例子,当我们用一个字符串的所有子串构筑字典树时,以DDA为例,我们是这样构筑的:

这里写图片描述

他的子串是“D”、“D”、“DD”、“DA”和“DDA”。

现在我们改成建立“DDA”的后缀自动机,是什么样子的呢?

这里写图片描述

呃,不太会用画图。

实际上只是删掉了多余的节点,移了移边而已…

哦,漏画了初始节点,请自行脑补。

还有,那些字母其实不在节点上而是在边上,也请自行脑补…

所以后缀自动机真的只是个字典树的最强进化型…

所以要讲的其实就这么多了,别的理解的也不深,不献丑了。

接下来我就要进入振奋人心的自动机实(w)战(a)环节了!

2019.4.8更新:
当你过了大半年再来看自己刚学时写的博客。
除了羞耻还能有别的感觉吗…
浅显还不正确的理解,因为学会新东西的兴奋而放肆写出。
关键是这篇博客不知道为啥点击挺多!还总有回(bian)复(shi)!
甚至还有求后续的…当时写的时候根本没想过后续,但是现在想想退役的时候应该会有一篇?
sam真是有意思而强大的算法,过了多久我肯定也都这么想。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值