后缀自动机
SC.ldxcaicai
我很菜=_=
展开
-
2018.07.17 后缀自动机模板(SAM)
洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写。 代码如下: #include<bits/stdc++.h> #define N 2000005 #define ll long long using namespace std; char s[N]; int a[N],siz[N],n,tot[N],root=1; ll ans=0; str...原创 2018-07-17 14:20:50 · 567 阅读 · 0 评论 -
bzoj3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
传送门 题意简述:给出一棵trietrietrie树,每个点表示一个字符,求树上所有路径组成的不同字串数。(叶子数≤20\le 20≤20) 由于有一个神奇的条件,考虑以每一个叶子为树根统计每个点到树根的字串,这样就考虑到了所有情况,于是就这样建立广义samsamsam统计答案即可。 代码: #include<bits/stdc++.h> #define ri register in...原创 2018-12-22 15:07:49 · 183 阅读 · 0 评论 -
spoj7258 Lexicographical Substring Search(后缀自动机)
传送门 samsamsam基础题。 题意简述:给出一个串,询问第kkk大的本质不同的串。 然而这就是弦论的简化版。 我们把samsamsam建出来然后贪心选择就行了。 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; int n,q,K; char s...原创 2018-12-22 16:35:24 · 216 阅读 · 0 评论 -
bzoj3277: 串(后缀自动机+启发式合并)
传送门 跟这道题是一模一样的。 于是本蒟蒻又写了一遍10min1A庆祝 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; typedef long long ll; int T,k; string s[N]; struct SAM{ int last,...原创 2018-12-22 16:51:11 · 319 阅读 · 0 评论 -
关于后缀自动机的一些想法&&题目收集(持续更新中)
上周学习了后缀自动机。 于是蒟蒻ldxldxldx在DZYODZYODZYO和zxyoizxyoizxyoi的引导下逐渐对samsamsam这个东西有了自己的认识。 chapter1chapter 1chapter1 想法&amp;总结 为啥会有samsamsam这个东西? 因为samsamsam可以做到利用O(n)O(n)O(n)的时空来识别一个字串的n2n^2n2个字串。 因为samsam...原创 2018-12-23 00:17:23 · 286 阅读 · 0 评论 -
bzoj4516: [Sdoi2016]生成魔咒(后缀自动机)
传送门 samsamsam入门题。 题意简述:给出一个串让你依次插入字符,求每次插入字符之后不同子串的数量。 显然每次的变化量只跟新出现的nnn个后缀有关系,那么显然就是maxlenp−maxlenlinkpmaxlen_p-maxlen_{link_p}maxlenp−maxlenlinkp。 注意到字符集很大,可以用mapmapmap来维护转移边。 代码: #include<bi...原创 2018-12-23 12:16:04 · 164 阅读 · 0 评论 -
bzoj2865&&1396: 字符串识别(后缀自动机+线段树)
传送门 卡空间差评! 题意简述:给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值。 解法:先建出samsamsam,显然只有当sizep=1size_p=1sizep=1的时候才对答案有贡献。 于是对于每个sizep=1size_p=1sizep=1的状态分情况更新答案。 pos=[pos[p]−len[link[p]]+1,pos[p]]pos=[pos[...原创 2018-12-23 14:16:29 · 323 阅读 · 0 评论 -
bzoj4556: [Tjoi2016&Heoi2016]字符串(二分答案+sam+线段树合并)
传送门 题意:给一个字符串SSS。 有mmm次询问,每次给四个参数a,b,c,da,b,c,da,b,c,d,问s[a...b]s[a...b]s[a...b]的所有子串和s[x...y]s[x...y]s[x...y]的最长公共前缀是多少。 思路:先翻转字符串转化为求最长公共后缀。 设现在求s[a...b]s[a...b]s[a...b]的所有子串和s[x...y]s[x...y]s[x......原创 2019-02-27 21:08:49 · 189 阅读 · 0 评论 -
bzoj4199: [Noi2015]品酒大会(sam+线段树)
传送门 题意:给一个串,每个位置有一个权值,当S[s...s+len−1]=S[t...t+len−1]&amp;&amp;S[s...s+len]̸=S[t..t+len]S[s...s+len-1]=S[t...t+len-1]\&amp;\&amp;S[s...s+len]\not=S[t..t+len]S[s...s+len−1]=S[t...t+len−1...原创 2019-03-01 00:04:14 · 160 阅读 · 0 评论 -
bzoj3473: 字符串(后缀自动机+启发式合并)
传送门 调代码调的我怀疑人生。 启发式合并用迭代写怎么都跑不过(雾 换成了dfsdfsdfs版本的终于过了233. 题意简述:求给出nnn个字串,对于每个给定的字串求出其有多少个字串在至少kkk个剩下字串中出现过。 显然先对所有字串建一个samsamsam出来,然后对于每个状态用一个setsetset维护在哪些字串里面出现过(这个显然需要在建完parentparentparent树之后启发式合并...原创 2018-12-22 14:23:22 · 338 阅读 · 0 评论 -
bzoj3238: [Ahoi2013]差异(后缀自动机)
传送门 后缀自动机好题。 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀。 然后想到parentparentparent树上面两个串的最长公共后缀跟他们所处状态的lcalcalca有关系。 于是对于每一个lcalcalca都处理出它的sizesizesize和maxlengthmax_{length}maxlength就行了。 代码: #i...原创 2018-12-21 19:26:04 · 231 阅读 · 0 评论 -
hdu4641 K-string(后缀自动机)
传送门 后缀自动机基础题。 题意简述:支持动态在串尾插入字符,查询在串中出现超过kkk次的子串的个数。 动态修改samsamsam,每次增量构造好了之后在parentparentparent树上从新建的npnpnp到根节点上没有超过kkk次的状态全部更新一遍统计答案就行。 因为从npnpnp到根的出现次数是单调递增的,因此只要当前节点出现次数不少于kkk次就不用继续更新了。 代码: #inclu...原创 2018-12-15 22:29:47 · 223 阅读 · 0 评论 -
2018.07.17 牛奶模式Milk Patterns(二分+hash)
传送门 好的一道简单字符串。这里收集了几种经典做法: SAM,不想写。 后缀数组+二分,不想写 后缀数组+单调队列,不想写 hash+二分,for循哈希,天下无敌!于是妥妥的hash 代码如下: #include&amp;lt;bits/stdc++.h&amp;gt; #define N 20005 #define Base 20001 using namespace std; inline int...原创 2018-07-17 14:34:21 · 292 阅读 · 0 评论 -
2018.07.17 HAOI2016 找相同字符(SAM)
传送门 就是给两个字符串,让你求公共字串的个数。 本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了。我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可。 代码如下: #include&lt;bits/stdc++.h&gt; #define N 400005 #define ll long long using namespace std; ...原创 2018-07-17 15:38:51 · 214 阅读 · 0 评论 -
spoj1812 Longest Common Substring(后缀自动机)
传送门 后缀自动机模板题。 题意简述:求两个字串的最长公共子串长度。 对其中一个构建后缀自动机,用另外一个在上面跑即可。 代码: #include&amp;lt;bits/stdc++.h&amp;gt; #define ri register int using namespace std; const int N=5e5+5; int n; char s[N]; struct SAM{ int tot,l...原创 2018-12-15 10:36:30 · 193 阅读 · 0 评论 -
bzoj3676: [Apio2014]回文串(后缀自动机)
传送门 对原串建立一个后缀自动机,然后用反串在上面匹配。 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l,maxpos][l,maxpos]就是一个回文串。 于是赶快码一波统计答案(很遗憾会wa) 因为有可能原串在答案中。 于是我们可以遍历其linklinklink链一直跳来更新答案。 代码: #incl...原创 2018-12-15 12:03:45 · 232 阅读 · 0 评论 -
poj3415 Common Substrings(后缀自动机)
传送门 后缀自动机基础题。 给两个字符串,让你求长度不小于kkk的公共子串的数量。 这题可以用后缀自动机解决废话 考虑对其中一个字串建出后缀自动机,然后用另一个在上面跑,注意到如果一个状态有贡献的话,从它到根的状态都会有贡献,因此我们给每个节点打一个懒标记最后再统计一次答案即可。 代码: #include<iostream> #include<cstdio> #inclu...原创 2018-12-15 15:56:18 · 182 阅读 · 0 评论 -
spoj Longest Common Substring II(后缀自动机)
传送门 后缀自动机基础题。 给出10个串求最长公共子串。 我们对其中一个建一个samsamsam,然后用剩下九个去更新范围即可。 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=2e5+5; int T=0,n; char s[N]; struct SAM{ i...原创 2018-12-15 17:05:09 · 167 阅读 · 0 评论 -
bzoj3998: [TJOI2015]弦论(后缀自动机)
传送门 后缀自动机基础题。 求第kkk小的子串(有可能要求本质不同) 直接建出samsamsam,然后给每个状态赋值之后在上面贪心选最小的(过程可以类比主席树/平衡树的查询操作)即可。 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=1e6+5; int n,t,...原创 2018-12-15 21:35:15 · 177 阅读 · 0 评论 -
spoj Substrings(后缀自动机)
传送门 后缀自动机基础题。 求长度为iii的子串出现次数的最大值。 对原串建出samsamsam,然后用sizsizsiz更新每个maxlenmaxlenmaxlen的答案。 然后由于后缀链接将其转化成了一种树形结构,因此直接在上面树形递推即可。 代码 #include<bits/stdc++.h> #define ri register int using namespace st...原创 2018-12-15 21:38:24 · 141 阅读 · 0 评论 -
bzoj2555: SubString(sam+lct)
传送门 题意简述: 要求在线支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 思路: 考虑用lctlctlct来动态维护samsamsam的rightrightright集合。 代码: #include<bits/stdc++.h> #define ri register int using namespace s...原创 2019-03-01 20:28:47 · 185 阅读 · 0 评论