上周学习了后缀自动机。
于是蒟蒻ldxldxldx在DZYODZYODZYO和zxyoizxyoizxyoi的引导下逐渐对samsamsam这个东西有了自己的认识。
chapter1chapter 1chapter1 想法&总结
-
为啥会有samsamsam这个东西?
因为samsamsam可以做到利用O(n)O(n)O(n)的时空来识别一个字串的n2n^2n2个字串。
因为samsamsam的增量构造法可以支持在线操作。
因为samsamsam建出的parentparentparent树将所有状态的从属关系从图形转化成了树形。
因为samsamsam建出的parentparentparent树正是其反串的后缀树。
… -
自动机上的转移边
要谈转移边,就先要提到一个神奇的词语:状态。
还记得在学习搜索的时候,我们就已经开始接触状态这个词语了。
我对状态的理解就是:记录了某一类具有相同性质的事物的集合
而对于samsamsam来说也同样是这样:同一个状态中的字串都有着相同的特点:endposendposendpos集合相同。这些都是后话了
而两个状态之间的联系正是神奇的转移边。
也就是说,一个字串被识别的过程正对应着DAGDAGDAG上的一条路径。
并且,这个关系是一个双射,即唯一的一个字串对应着一条唯一的路径妙不可言。 -
maxlenmaxlenmaxlen数组的妙用
在构建好samsamsam之后,设一个状态的大小为[minleni,maxleni][minlen_i,maxlen_i][minleni,maxleni]。其后缀链接是linkilink_ilinki,那么有性质:minleni=maxlenlinki+1minlen_i=maxlen_{link_i}+1minleni=maxlenlinki+1
还有就是两个状态的lcplcplcp就是其lcalcalca的maxlenmaxlenmaxlen大小。 -
samsamsam与回文串的判断
对原串建立一个后缀自动机,然后用反串在上面匹配。
如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l,maxpos][l,maxpos]就是一个回文串。 -
广义samsamsam
即对于所有的母串建立的后缀自动机。
广义samsamsam的3种建法:
5.1. 每建完一个字串之后把lastlastlast指向根节点
5.2. 一个一个建,如果当前已经有相同转移就看是否需要分裂
5.3. 离线bfsbfsbfs按照层划分顺序来建。 -
samsamsam可以解决的问题(动态更新)
最长公共子串
第kkk小的子串
第kkk小的本质不同的子串
某一个字串在另一个字串里的出现次数
chapter2chapter 2chapter2 题目收集
模板
求公共子串个数
求最长公共子串长度
求所有回文串出现次数
给两个字符串,让你求长度不小于k的公共子串的数量
给出最多10个串求最长公共子串
求第kkk小子串
求长度为1~n的子串出现次数的最大值
支持动态在串尾插入字符,查询在串中出现超过k次的子串的个数
求求求后缀两两lcplcplcp之和
给出n个字串,对每个串求出有多少个子串在至少k个字串中出现过
给出一棵trie树,求树上所有路径组成的不同字串数
给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值