![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SAM
Nightmare丶
登高必自卑,行远必自迩
展开
-
BZOJ 4892: [Tjoi2017]DNA(SA+RMQ / SAM)
Description加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够表现出吃藕的性状。现在研究人员想知道这个基因在DNA链S0上的位置。所以你需要统计在一个表现出吃藕性状的人的DNA序列S0上,有多少个连续子串可能是该基因,即有多少个S0的连续子串修改小于等于三个...原创 2020-01-12 23:39:41 · 219 阅读 · 2 评论 -
BZOJ 2946.公共串(SA+二分/SAM)
题目描述给出几个由小写字母构成的单词,求它们最长的公共子串的长度。输入格式文件的第一行是整数 n,1≤n≤51\le n \le 51≤n≤5,表示单词的数量。接下来nn行每行一个单词,只由小写字母组成,单词的长度至少为1,最大为2000。输出格式仅一行,一个整数,最长公共子串的长度。题解:把所有串接在一起,中间用其他符号连接,然后二分答案,判断一段中的LCP是否来自所有串即可...原创 2020-01-12 17:16:51 · 156 阅读 · 0 评论 -
「雅礼集训 2017 Day1」字符串(后缀自动机)
题目链接题解:首先暴力跑SAM时间复杂度O(Qmk)肯定过不了,注意到∑w≤1e5\sum w≤1e5∑w≤1e5,也就是说Q∗k≤1e5Q*k≤1e5Q∗k≤1e5,所以我们可以针对Q更小或者k更小时用两种不同的方法。k比Q小:发现每个w的长度就会比较小,它的子串数量就可能会很少,会出现子串数量还没有m多的情况,这个时候就会有m个[li,ri][l_i,r_i][li,ri]询问存在重...原创 2019-12-09 21:41:27 · 253 阅读 · 0 评论 -
Codeforces G. Yet Another LCP Problem(SAM+虚树)
题意:输入一个长度为n的字符串S,和Q次询问,每次询问输入m个数表示a序列,k个数表示b序列。试对于每个询问计算下列式子:∑i=1i=m∑j=1j=kLCP(s[ai...n],s[bj...n])\sum_{i=1}^{i=m}\sum_{j=1}^{j=k}LCP(s[a_i...n],s[b_j...n])i=1∑i=mj=1∑j=kLCP(s[ai...n],s[bj...n]...原创 2019-11-20 23:32:44 · 280 阅读 · 0 评论 -
Codeforces F. Forbidden Indices(后缀自动机)
题目链接题解:建立后缀自动机,根据第二个字符串的01情况对后缀自动机上的点进行标记,排序后让出现次数和标记一起传给它的fa,最后统计时去掉标记即可。AC代码:#include<bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 4e5+50;int nxt[MAXN][26],...原创 2019-11-18 18:08:06 · 156 阅读 · 0 评论 -
Codeforces 427D Match & Catch(后缀自动机)
题意:给你两个字符串,让你求出这两个字符串的最短公共子串,且这个子串在这两个字符串中都只出现过一次题解:对这两个串分别建SAM,然后dfs跑相同边判断即可。AC代码:#include<bits/stdc++.h>using namespace std;const int MAXN = 1e4+50;const int INF = 0x3f3f3f3f;struct ...原创 2019-11-17 20:53:51 · 118 阅读 · 0 评论 -
BZOJ 1396: 识别子串(SAM+线段树)
题意:题解:SAM+线段树先建出SAM,根据题意,只有endposendposendpos集合大小为111的结点才能造成贡献。对于每一个endposendposendpos集合大小为111的我们都能算出maxlenmaxlenmaxlen和minlenminlenminlen,显然ⅡⅡⅡ区域内每个点的贡献就是ⅡⅡⅡ区域的长度,ⅠⅠⅠ区域内每个点的贡献就是到ⅡⅡⅡ区域的距离加上ⅡⅡⅡ区域...原创 2019-11-10 01:32:50 · 126 阅读 · 0 评论 -
ACM-ICPC 2018焦作赛区网络预赛 H String and Times
题意:给你一个字符串S,让你求出S的所有子串中出现次数在[A,B]的子串个数题解:SAM水题,建立SAM后排序求出endpos集合,将所有符合条件的endpos集合内的maxlen−minlen+1maxlen-minlen+1maxlen−minlen+1累加即可AC代码:#include<bits/stdc++.h>using namespace std;typede...原创 2019-11-09 22:43:51 · 122 阅读 · 0 评论 -
BZOJ 4032: [HEOI2015]最短不公共子串
Description在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。下面,给两个小写字母串A,B,请你计算:(1) A的一个最短的子串,它不是B的子串(2) A的一个最短的子串,它不是B的...原创 2019-11-09 21:35:09 · 198 阅读 · 0 评论 -
BZOJ 4516: [Sdoi2016]生成魔咒
题目描述魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1、21、21、2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]。一个魔咒串 SSS 的非空字串被称为魔咒串 SSS 的生成魔咒。例如 S=[1,2,1]S=[1,2,1]S=[1,2,1] 时,它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1][1]、[2]、[1,2]、[2,1]、...原创 2019-11-08 22:19:42 · 80 阅读 · 0 评论 -
[Lexicographical Substring Search] SPOJ - SUBLEX
题意:给你一个字符串,Q次询问所有本质不同的子串中,第k小的子串。题解:这道题和[P3975 [TJOI2015]弦论]一样,只是这道题要求更少,所以这篇就给个传送门吧,主要是懒…ACACAC代码:#include<bits/stdc++.h>using namespace std;const int MAXN = 2e5+50;char s[MAXN];struct...原创 2019-11-04 17:55:03 · 106 阅读 · 1 评论 -
[Substrings] SPOJ - NSUBSTR
题意:求一个关于串的函数FFF,F[i]F[i]F[i]表示串中长度为iii的子串出现的最多次数题解:这道题就是求SAMSAMSAM中每个点的RightRightRight大小,因为每个endposendposendpos类表示的是出现次数以及位置一样的一类子串。对于这道题,我们只需要计算出这个Right集合的大小即可,因为fafafa树的某个节点Right集合是它父亲的真子集,所以我们可以...原创 2019-11-04 17:37:23 · 111 阅读 · 0 评论 -
[Longest Common Substring II] SPOJ - LCS2
题意:求n个字符串的最长公共子串的长度题解:这个题可以类比只有两个字符串的情况来做。我们仍然选择对第一个字符串建立SAM,然后对于其他串在SAM上匹配,过程中记录一下每个字符串到达SAM中某个节点时的长度,对于每个状态取minminmin,然后从最小值中选取最大值即为答案。ACACAC代码:#include<bits/stdc++.h>using namespace st...原创 2019-11-03 23:18:27 · 122 阅读 · 0 评论 -
P4248 [AHOI2013]差异(SAM/SA)
题意:给出一个长度为nnn的字符串,求 ∑1<=i<j<=nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj)\sum_{1<=i<j<=n} len(Ti)+len(Tj)−2∗lcp(Ti,Tj)1<=i<j<=n∑len(Ti)+len(Tj)−2∗lcp(Ti,Tj)题解:方法一:考虑把原串翻转过来,那么要求的就是所有前...原创 2019-11-01 01:37:10 · 211 阅读 · 0 评论 -
P3975 [TJOI2015]弦论
题意:给出两个整数ttt , kkk,ttt为0则表示不同位置的相同子串算作一个,ttt为111则表示不同位置的相同子串算作多个。让你求出字符串的第kkk小子串是什么。题解:我们首先只考虑如何输出第k小的子串,很显然,有一个性质,首位字符越小,子串排名越靠前,我们可以考虑一个字符一个字符的枚举,若第k小的子串是以当前字符开头的,那么就往下走,否则枚举下一个字符,再减去这个字符开头的子串个数。...原创 2019-10-31 15:24:43 · 119 阅读 · 0 评论 -
P3804 【模板】后缀自动机
SAM模板题#include<bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 2e6+50;char s[MAXN];int a[MAXN],c[MAXN];struct Suffix{ int last=1,tot=1; int nxt[MAXN][26],f...原创 2019-10-30 16:55:54 · 76 阅读 · 0 评论