![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀自动机
里阿奴摩西
这个作者很懒,什么都没留下…
展开
-
[后缀自动机 模板题] SPOJ 1812 Longest Common Substring II & BZOJ 2946 [Poi2000]公共串
后缀自动机模板题啦 对一个串建后缀自动机,其他串在上面匹配 每个状态记录每个串最长匹配长度的最小值 然后找到所有状态中答案最长的一个即可 需要注意的是这里不仅要用到自动机的性质 还要用到树的性质 如果一个状态被走到了 那么他的link也一定出现了 因为link对应的就是这个东东的一个子串 而我们跑自动机的时候不一定跑到了link这个点说来说去就是循环里的第三行for (int i=ncnt原创 2017-01-28 20:53:10 · 394 阅读 · 0 评论 -
[广义后缀自动机 SG值] 51Nod 1869 那些年,我们一起讲的故事
简直 在众人的帮助下理解了一个假题意 看完题解知道真题意 大概是每次加一个字符 这个串仍然要是Trie树的子串 直接建SAM 然后求SG值 不超过度数+1 也就是27 然后先手必胜 两边SG不同 那么按字典序数一数就好了#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<cass原创 2017-06-13 21:58:55 · 568 阅读 · 0 评论 -
[后缀自动机 后缀树 虚树] BZOJ 3879 SvT
挺无脑的一个题 直接反串后缀自动机建出后缀树 然后询问建虚树#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1=原创 2017-04-24 21:00:44 · 666 阅读 · 0 评论 -
[manacher 后缀自动机 || 回文自动机] BZOJ 3676 [Apio2014]回文串
本质不同的回文串只有O(n)O(n)个 就是做manacher时变长的时候 那么直接在SAM上找找出现几次就好了 回文自动机?我不会啊#include<cstdio>#include<cstdlib>#include<map>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){ s原创 2017-04-28 20:33:48 · 531 阅读 · 0 评论 -
[后缀自动机 线段树] BZOJ 1396 识别子串 & BZOJ 2865 字符串识别
后缀自动机建起来发现出现一次的子串必然由|right(x)|==1的状态也就是叶子节点贡献 对于每个叶子x 在串上的位置为p 令l为maxs(x) 令r为maxs(fat(x)) 那么区间[p-r+1,p]用r+1更新答案 区间[p-l+1,p-r]用一条斜率为-1的线段更新答案 这个可以暴力跑李超线段树 但是这道题很特殊啊 直接上两颗线段树分别维护两种情况就好了上2865的代码吧 这题t原创 2017-01-30 19:30:01 · 714 阅读 · 0 评论 -
[广义后缀自动机] BZOJ 3473 字符串 & BZOJ 3277 串 & Codeforces 204E #129 (Div. 1) E. Little Elephant and Strings
现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身)广义后缀自动机的模板题啦 构建方法和单串的自动机是基本一样的 每次考虑完一个串把last返回root#include<cstdio>#include<cstdlib>#include<set>#include<cstring>#include<algorithm>using原创 2017-01-29 22:22:19 · 859 阅读 · 0 评论 -
[后缀自动机 模板题 || 字符串Hash] HDU 4622 Reincarnation
题目大意:询问子串lr的不同子串数目 暴力建n次后缀自动机 存一下不同子串数目就好啦 不同子串数目 有两种做法 一种是按拓扑序DP 还有就是∑maxs(x)−maxs(fa(x))\sum maxs(x)-maxs(fa(x)) 显然第二种方法更好些 更通用#include<cstdio>#include<cstdlib>#include<algorithm>#include<cs原创 2017-01-29 22:16:36 · 657 阅读 · 0 评论 -
[广义后缀自动机 set启发式合并 || dfs序 树状数组 离线] BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster
可以直接用[广义后缀自动机] BZOJ 3473 字符串 & BZOJ 3277 串 & Codeforces 204E #129 (Div. 1) E. Little Elephant and Stringsset启发式合并的方法 还有一种是离线做法 通过dfs序转化为一段区间内不同数字的数量 就是 [SDOI2009]HH的项链的经典做法啦#include<cstdio>#includ原创 2017-01-29 22:36:31 · 549 阅读 · 0 评论 -
[广义后缀自动机 Trie树] BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
因为叶子节点很少 我们把20个trie合并成广义后缀自动机 然后直接跑就好了 trie树构建自动机的时候 回溯的时候把last还原#include<cstdio>#include<cstdlib>#include<set>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;inlin原创 2017-01-29 22:24:40 · 576 阅读 · 0 评论 -
[二分 后缀自动机 单调队列优化DP] BZOJ 2806 [Ctsc2012]Cheat
先在后缀自动机上匹配 求出mat[i]表示作文的每个位置i为结尾最长能匹配多长二分L 设f[i]表示前i个字符熟悉的部分最多有多长 那么f[i]=max(f[i-1],f[j]+i-j) 其中j要满足i-j>=L&&i-j+1<=mat[i] 得i-mat[i]<=j<=i-L 而mat[i]+1>=mat[i+1] 得i+1-mat[i+1]>=i-mat[i] 所以i-mat[i]原创 2017-01-28 21:29:18 · 359 阅读 · 0 评论 -
[后缀自动机 LCT] BZOJ 2555 SubString
构建后缀自动机 parent树会改变形态 这样|right(x)|也会发生变化 我们用LCT大力维护一发就好了#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,原创 2017-01-28 21:26:09 · 348 阅读 · 0 评论 -
[后缀自动机 构建后缀树 树形DP] BZOJ 3238 [Ahoi2013]差异
反串的parent树就是后缀树 lcp就是他们的lca的深度 也就是后缀自动机上的maxl 然后树形DP一下就好了#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*原创 2017-01-28 21:22:57 · 649 阅读 · 0 评论 -
[后缀自动机 parent树] BZOJ 4566 [Haoi2016]找相同字符
对一个串A建自动机 另一个串B在上面匹配 考虑统计答案 对于当前匹配到的点,那么它parent树中的祖先代表的串现在肯定也出现了 对于每个出现的点,它代表了maxs[x]-maxs[fa[x]]个串 这些串出现了|right(x)|次,贡献就是|right(x)|*(maxs[x]-maxs[fa[x]]) 因为要统计祖先的,所以把祖先的也累加到这个节点即可#include<cstdio>原创 2017-01-28 21:17:24 · 449 阅读 · 0 评论 -
[后缀自动机] POJ 1743 Musical Theme
又一道男人八题哦 先差分 然后就是找出现两次的不相交的最大子串 考虑对于每个点 记录它的right集的最值 用差值和maxl的最小值更新答案#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#define cl(x) memset(x,0,sizeof(x))using namespace std;原创 2017-01-28 21:13:35 · 439 阅读 · 0 评论 -
[K大子串 后缀自动机 模板题] BZOJ 3998 [TJOI2015]弦论
题目大意:分别求 重复子串算一次 重复子串算多次 的 K小子串若重复子串算一次 那么每个状态计数1次 若重复子串算多次 那么每个状态计数|right(x)|次 然后跑就好了#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static char buf[10原创 2017-01-28 21:09:10 · 444 阅读 · 0 评论 -
[最小循环表示 后缀自动机 模板题] BZOJ 2882 工艺
题目大意:最小循环表示有O(n)O(n)的简洁巧妙的解法 但是为了练习后缀自动机 把串复制一遍,构建后缀自动机,每次选择最小的边转移即可 因为字符集很大,所以转移边用map来存即可#include<cstdio>#include<cstdlib>#include<algorithm>#include<map>using namespace std;inline char nc(){原创 2017-01-28 21:02:02 · 632 阅读 · 0 评论 -
[后缀自动机 模板题] SPOJ 8222 Substrings
题目大意:求某个长度的所有子串中出现次数最多的次数每个状态对应一段长度区间的子串 right集合的大小就是出现次数 那么我们用|right(x)|去更新f[maxs[x]]的值,最后从大到小用f[i]去更新f[i-1]的值即可#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char原创 2017-01-28 20:59:21 · 699 阅读 · 0 评论 -
[后缀自动机 模板题] SPOJ 1811 Longest Common Substring
后缀自动机模板题啦 对A建自动机 B在上面匹配 假设现在到B[i-1]的最长公共子串长度为l 如果当前节点有B[i]这个孩子,那么直接就l++即可。 如果没有就找一直向前找suffix_link,直到找到有B[i]这个孩子的节点 类似KMP中的next和AC自动机中的fail#include<cstdio>#include<cstdlib>#include<algorithm>usi原创 2017-01-28 20:47:04 · 430 阅读 · 0 评论 -
[后缀数组 后缀树] Codechef January Challenge 2018 #KILLKTH Killjee and k-th letter
建出后缀树,记录每个子串的出现次数,然后二分下答案在哪个子串中就好了退役选手不会写后缀自动机#include#include#include#include#define pb push_backusing namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=b原创 2018-01-19 14:07:23 · 694 阅读 · 0 评论