后缀自动机
Master.Yi
学习他人,提升自己;
提升自己,帮助他人。
展开
-
20200721 T2 s2mple【后缀自动机妙用】
题目描述 n,Q≤4∗105n,Q\le4*10^5n,Q≤4∗105 题目分析 建 SSS 的 SAM。记询问串为 TTT。 要数 SSS 中本质不同的串中 TTT 的出现次数之和 相当于给 TTT 后面接上一个串 RRR,前面接上一个串 LLL,LTRLTRLTR 出现在 SSS 中,求 L,RL,RL,R 的对数。 假设已经确定了 TR=pTR=pTR=p,考虑怎么数 LLL:以 ppp 为后缀的串,就是在 ppp 对应 fail 树上节点 qqq 子树中的串,加上 qqq 剩下长度对应的串。可以表原创 2020-07-21 15:50:04 · 341 阅读 · 0 评论 -
CF700E Cool Slogans【神奇结论 + 后缀自动机DP】
洛谷链接 题目分析: 题解 我主要是给结论画画图: Code: #include<bits/stdc++.h> #define maxn 400005 #define maxp maxn*30 using namespace std; int rt[maxn],lc[maxp],rc[maxp],tot; void ins(int &i,int l,int r,int x){ i=++tot; if(l==r) return; int mid=(l+r)>>1; x.原创 2020-06-12 22:01:49 · 210 阅读 · 0 评论 -
CF1276F Asterisk Substrings【endpos后缀的本质不同串个数(dfs序并)】
题目分析: s,s∗,∗ts,s*,*ts,s∗,∗t 都很好求,问题主要在与 s ∗ ts\!*\!ts∗t 考虑枚举本质不同的 sss,需要借助后缀自动机。 发现对于 endposendposendpos 集合相同的 sss,可选的 ttt 的集合都是一样的,即对于后缀自动机上的节点 uuu,它对答案的贡献是(len[u]−len[fa[u]])∗(len[u]-len[fa[u]])*(len[u]−len[fa[u]])∗ (∪p∈endposu s[p+2,n](\cup_{p\i.原创 2020-06-11 20:54:25 · 264 阅读 · 0 评论 -
Codeforces666E Forensic Examination【后缀自动机串定位,线段树合并】
题目描述: 洛谷链接 题目分析: 对T[1...m]T[1...m]T[1...m]建广义后缀自动机,可持久化线段树合并维护 endpos\texttt{endpos}endpos 集合中哪个串最多,以及最多的出现次数。 定位S[pl,pr]S[p_l,p_r]S[pl,pr]在TTT上的位置,具体地,把SSS放到后缀自动机上匹配,求出每个前缀S[1...i]S[1...i]S[1...i]匹配的最长后缀长度plen[i]plen[i]plen[i],及其在后缀自动机上的对应位置pos[i]pos[i原创 2020-06-11 18:59:42 · 194 阅读 · 0 评论 -
Codeforces1037H Security【贪心+后缀自动机线段树合并维护endpos集合】
题目描述: 洛谷链接 题目分析: 要求S1S_1S1字典序尽量小,又要严格大于TTT。那么最优肯定是尽可能前面一段与TTT相同,然后下一个字符大于TTT。 又因为S1S_1S1是SSS的子串,所以可以建出SSS的后缀自动机,然后找到TTT的前缀能够匹配的最长长度lenlenlen,那么对于 i∈[1,len+1]i\in[1,len+1]i∈[1,len+1],我们想要找到最大的一个 iii,使得S1[1,i−1]=T[1,i−1]S_1[1,i-1]=T[1,i-1]S1[1,i−1]=T[1,i原创 2020-06-09 21:29:21 · 404 阅读 · 0 评论 -
LOJ#6198. 谢特【后缀自动机/数组 + Trie树查异或最大值 + Trie树合并】
题目描述: n≤105,wi<nn\le10^5,w_i<nn≤105,wi<n,LOJ题目链接 题目分析: 看到两个后缀的LCP就想到后缀自动机或者后缀数组 先从后缀自动机的思路入手,我们知道两个后缀的LCP就是它们在后缀自动机fail树上的LCA的len。 所以这道题就变成了:在fail树上,求uuu点的不同子树内的wi xor wjw_i~\text{xor} ~w_jwi xor wj的最大值。 需要Trie树合并,查询异或最大值。原创 2020-06-09 17:03:31 · 222 阅读 · 0 评论 -
HDU5659 CA Loves Substring【后缀自动机求切开某个位置后的不同子串个数】
题目描述: 从字符串SSS的某个位置iii将其分为S[1,i]S[1,i]S[1,i]和S[i+1,n]S[i+1,n]S[i+1,n]两部分,问这两部分共有多少本质不同的字符串,对每个i∈[1,n]i\in[1,n]i∈[1,n]输出答案。 n≤200000n\le200000n≤200000 题目分析: 求出每种字符串最早出现的位置LLL和最晚出现的位置RRR,记它的长度为lenlenlen,那么对于i∈[R−len+1,L−1]i\in[R-len+1,L-1]i∈[R−len+1,L−1],不同的字原创 2020-05-10 17:07:55 · 148 阅读 · 0 评论 -
HDU4622 Reincarnation【区间不同子串数】
题目描述: RT,n≤2000,Q≤10000n\le2000,Q\le10000n≤2000,Q≤10000。 题目分析: 固定左端点,后缀自动机,每次答案加上len[last]−len[fa[last]]len[last]-len[fa[last]]len[last]−len[fa[last]]。 hash,区间DP,设子串上一次出现的位置为xxx,当前位置为iii,长度为lll,那么f[i...原创 2020-03-05 16:54:39 · 166 阅读 · 0 评论 -
HDU3518 Boring counting【出现次数大于1且不重叠子串的个数 (后缀自动机)】
题目描述: 大意RT。 题目分析: 求出后缀自动机上每个节点endpos集合的最左和最右记为L,RL,RL,R。 如果R−L≥len[i]−len[fa[i]]R-L\ge len[i]-len[fa[i]]R−L≥len[i]−len[fa[i]],那么这个点代表的所有子串都可行。 否则就只是max(R−L−len[fa[i]],0)\max(R-L-len[fa[i]],0)max(R−L−...原创 2020-03-05 16:04:49 · 179 阅读 · 0 评论 -
关于后缀自动机的理解
一个点表示一个终点集合,即表示一段连续长度的后缀,其后缀链接指向最大长度为minlen-1的点 clone就是因为在len[p]+1<len[q]的情况下,cur的后缀链接并不能直接指向q,这样会导致不合法的后缀出现 所以clone q,把原来q的后缀分成两部分,一部分是len<=len[p]+1的,另一部分是len>len[p]+1的 这也是为什么要把p的后缀链接中点重定...原创 2020-02-04 22:31:38 · 138 阅读 · 0 评论 -
NOIP模拟赛20191007 T2 好文章【(卡)哈希 / 后缀自动机】
题目描述: 长为n的字符串,找出其中长度为m的不同子串的数量。 1<=m<=n<=200000 题目分析: 显然可以哈希。 但是出题人把我震惊了: 啪啪啪…(鼓掌) 于是我们知道了自然溢出很危险。。模数109左右更危险。。 所以我们哈希要用两个模数或者用一个超大模数加上大数乘法取模(x*y-(LL)((long double)x/p*y)*p)(模数比如说可以是5211...原创 2019-10-07 15:48:51 · 229 阅读 · 0 评论 -
BZOJ 2946: [Poi2000]公共串【后缀自动机/后缀数组】
题面: 给出几个由小写字母构成的单词,求它们最长的公共子串的长度。 文件的第一行是整数 n,1<=n<=5,表示单词的数量。接下来n行每行一个单词,只由小写字母组成,单词的长度至少为1,最大为2000。 题目分析: 后缀数组做法: 将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开, 求后缀数组。然后二分答案,按照height值将后缀分成若干组,判断每组 的后缀是否包...原创 2019-04-01 16:58:17 · 225 阅读 · 0 评论 -
BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡【广义后缀自动机】
题目传送门 题目分析: 这道题就是求多个串的不同子串的个数。 广义后缀自动机,就是可以表示所有串的所有后缀的自动机。 其实就是建完一个串之后,把另一个串接在初始节点后面建就好了。 看完这句话的第一反应? 点分治! 不是度数不超过20,是叶子数不超过20。。。 所以从每个叶子跑一个SAM,把它们合并起来变成一个大SAM,统计在这个大SAM上不同的子串个数。 怎么统计? 蒟蒻知道两种方法 : “每...原创 2019-04-01 14:52:04 · 237 阅读 · 0 评论 -
BZOJ 3998: [TJOI2015]弦论【后缀自动机】
题面: 对于一个给定长度为N的字符串,求它的第K小子串是什么。 Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个。T=1则表示不同位置的相同子串算作多个。 N<=500000 题目分析: 后缀自动机神奇的性质。。 不同位置的算多个,那么除了根节点每个点代表其终点集合个串。 不同位置的算一个,那么除了根节点每个点代表一个串(...原创 2019-04-01 11:26:00 · 151 阅读 · 0 评论 -
BZOJ 4032: [HEOI2015]最短不公共子串 【DP+后缀自动机】
题面: Description 在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 下面,给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短的子序列,它不是B的子序列 A和B的长度都不超过2000 题目分析: 这题本质上就是个DP,只不过...原创 2019-04-01 10:25:38 · 183 阅读 · 0 评论 -
SPOJ 8222 Substrings 【后缀自动机模板】
题目描述: 给定一个字符串S,求所有长度为len (len∈[1,|S|]) 的S的子串中出现次数最多的子串的出现次数。 题目分析: 后缀自动机模板,通过后缀链接累计出现次数cnt,ans[len]就是路径长度为len的cnt最大值 #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; #define ma.原创 2019-01-18 12:02:25 · 221 阅读 · 0 评论