随笔分类 - 后缀自动机
1
摘要:对反串建SAM得到后缀树,两后缀的lcp就是其在后缀树上lca的len值,于是每次询问对后缀树建出虚树并统计答案即可。
阅读全文
摘要:建出广义SAM,通过parent树对每个节点求出其是否仅被一个子串包含及被哪个包含。 写了无数个sam板子题一点意思都没啊
阅读全文
摘要:对trie建SAM,询问串倒过来跑到的节点的|right|即为答案。
阅读全文
摘要:将所有串(包括S)放一块建SAM。对于询问,倍增定位出该子串所在节点,然后要查询的就是该子串在区间内的哪个字符串出现最多。可以线段树合并求出该节点在每个字符串中的出现次数。
阅读全文
摘要:对作文库中的串建出广义SAM,然后显然可以二分答案,二分之后考虑暴力dp,设f[i]为前i位最长匹配长度,显然有f[i]=max(f[i-1],f[j]+i-j) (i-j>=l&&j+1~i能在作文库中匹配)。在SAM上跑并记录匹配长度,单调队列优化dp即可。
阅读全文
摘要:对多串建立SAM的一种方法是建trie再对trie建SAM。构造方式分为在线(也即不建trie而是依次插入每个串,或在trie上dfs)和离线(也即建好trie再bfs)。其中离线构造与单串的构造方式几乎没有区别,将父亲所在节点作为last即可,按bfs序建SAM可以避免出现要转移到的状态已经存在的
阅读全文
摘要:对多串建立SAM的一种方法是加分隔符。于是加完分隔符建出SAM。 考虑统计出每个节点被多少个串包含。让每个串各自在SAM上跑,跑到一个节点就标记(显然一定会完全匹配该节点,因为是对包含其的串建的SAM)并暴跳fail,遇到已经被该串标记过的点就停止。 这样暴力的复杂度容易感性证明是O(Lsqrt(L
阅读全文
摘要:先考虑没有动态加字符怎么做。计算每个节点的贡献,当|right|>=k时将len-lenfa计入即可。 动态加字符后,这个东西难以用LCT维护。于是考虑离线。建完SAM后,容易发现每个节点在时间上的一段后缀提供贡献,且具体时间就是其right集合中的第k小。主席树或线段树合并求出即可。
阅读全文
摘要:询问串放在SAM上不跳fail跑到的节点的|right|即为答案。用LCT维护parent树即可。可以直接维护子树信息,也可以转化为路径加。注意强制在线所使用的mask是作为参数传进去的。
阅读全文
摘要:先考虑l=1,r=n,并且不要求本质不同的情况。对原串建SAM,将询问串在上面跑,得到每个前缀的最长匹配后缀即可得到答案。 然后考虑本质不同。对询问串也建SAM,统计每个节点的贡献,得到该点right集合中任意一个的匹配长度即可。 然后考虑原问题。我们需要求的仍然只是每个前缀的最长匹配后缀。通过线段
阅读全文
摘要:对反串建SAM弄出后缀树,每个b串通过倍增定位其在后缀树上对应的节点,根据其长度将节点拆开。然后每个a串也找到对应的节点,由该节点向表示a串的节点连边,再把所给的边连上跑拓扑排序即可。
阅读全文
摘要:本质不同子串数量等于所有点的len-parent树上父亲的len的和。可以直接维护。
阅读全文
摘要:二分答案后相当于判断一个区间的后缀与某个后缀的最长公共前缀是否能>=ans。建出后缀树,在上述问题中后者所在节点向上倍增的跳至len>=ans的最高点,然后相当于查询子树中是否有该区间的节点。主席树进行二维数点即可。
阅读全文
摘要:利用SAM建出后缀树,树上每个节点计算一下|right|、right集合中ai的最大、次大、最小、次小值即可。
阅读全文
摘要:对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然是|right|*(len-len[fa])。预处理一下就好了。
阅读全文
摘要:先考虑相同子串视为一个。按SAM的拓扑序预处理出从每个节点开始能得到多少个本质不同子串(注意虽然一个节点对应多个子串,但到达该点时当前的子串显然是确定为其中一个的),然后按位贪心即可。 相同子串视为多个的做法也没有本质区别。求出每个节点的right集合大小,同样预处理出从每个节点开始能得到多少个子串
阅读全文
摘要:差分后即求多串LCS。先考虑两个串怎么做。对第一个串建SAM,第二个串在上面跑即可,任意时刻走到的节点表示的都是第二个串的当前前缀在第一个串中出现的最长的后缀,具体计算长度时每走一个字符长度+1,跳fail时将长度重设为当前节点maxlen即可。 扩展到多串,同样对第一个串建SAM,后面每个串在上面
阅读全文
摘要:由于本质不同的回文子串数量是O(n)的,考虑在对于每个回文子串在第一次找到它时对其暴力统计。可以发现manacher时若右端点移动则找到了一个新回文串。注意这样会漏掉串长为1的情况,特判一下。 现在问题变为统计一个子串的出现次数。可以用SA,二分乱搞一下即可。这里使用SAM。以parent树上表示该
阅读全文
摘要:建出parent树统计即可。开始memcpy处写的是sizeof(son[y]),然后就T掉了……还是少用这种东西吧。 同时也有SA做法。答案子串一定是名次数组中相邻两个串的lcp。单调栈统计其是几个后缀的前缀即可。
阅读全文
摘要:参考:https://blog.csdn.net/doyouseeman/article/details/52245413 https://wenku.baidu.com/view/90f22eec551810a6f4248606.html APIO2018课件《从DFA到后缀自动机》张云帆 随便写
阅读全文
1