![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀自动机
forever_shi
但行好事,莫问前程;行你所行,无问西东!
展开
-
洛谷4094 HEOI2016 TJOI2016 字符串 SAM 倍增 主席树+树上差分/线段树合并 二分 (无代码)
题目链接题意:给你一个长度为nnn的字符串,有mmm次询问,每次询问给你四个参数a,b,c,da,b,c,da,b,c,d,问你字串s[a...b]s[a...b]s[a...b]中的所有字串与字串s[c..,d]s[c..,d]s[c..,d]的最长公共前缀的长度。n,m<=1e5n,m<=1e5n,m<=1e5,字符集是小写字母题解:兴冲冲地去你谷找主席树的黑题,结果发现四道写过两个,其中IOI那个写的是线段树合并,然后这个好像又不是个难题。由于退役太久,现在不会SA了,然原创 2020-11-13 20:29:56 · 91 阅读 · 0 评论 -
CF1437 G Death DBMS AC自动机/SAM+树链剖分+multiset(+动态开点权值线段树)(无代码)
题目链接题意:给你nnn个字符串,每个字符串有一个权值,初始都是000。有mmm次操作,每次操作有两种类型,第一种是把第iii个字符串的权值变成xxx,第二种是给你一个字符串,问你在这nnn个串中是询问串字串的所有字符串的最大权值。n,m<=3e5n,m<=3e5n,m<=3e5,原始串和询问串的总串长均不大于3e53e53e5题解:首先感谢Creed_qwq大佬的博客!牛爷NB!最近正好复习SAM,遇到这么一个字串的问题就直接想SAM了。这个题很明显首先对这nnn个串建SA原创 2020-10-30 15:55:53 · 160 阅读 · 0 评论 -
BZOJ5261 Rhyme 广义SAM
题目链接题意:给定n个由小写字母构成的模板串,给定k,求最长的字符串,使得该字符串每个长度为k的子串都是至少一个模板串的子串。求最大长度,如果可以无限长输出INF。∑∣s∣&amp;amp;lt;=100,000,k&amp;amp;lt;=100,000∑|s|&amp;amp;lt;=100,000,k&amp;amp;lt;=100,000∑∣s∣&amp;lt;=100,000,k&amp;lt;=1原创 2018-12-14 15:35:59 · 443 阅读 · 0 评论 -
洛谷4022 BZOJ2806 CTSC 2012 熟悉的文章 cheat 广义SAM dp 单调队列 二分
题目链接题意:给你nnn个模式串和mmm个询问串,对于每个询问串,如果能划分成若干个长度大于等于lll的这nnn个模式串中的某个子串,和一些不需要匹配的零散串,要求匹配串总长度不少于串长的9090%90,那么称lll对于这个串是合法的,对于每个串求最长的lll。串都是01串,输入的字符数总和是1e6级别。题解:我们比较容易感知到这个题是满足二分性的,lll大的可以小的也是可以的啊,因为划分...原创 2018-12-16 21:51:14 · 191 阅读 · 0 评论 -
洛谷2463 BZO4698 SDOI2008 Sandy的卡片 差分 SAM
题目链接题意:给你nnn个数字串,每个串由mmm个数字组成,定义两个串的公共部分长度为一个串中的所有数字加上同一个数之后会变成另一个串里的对应位置的数,并且两个串长度相同。求这nnn个数字串的最长公共部分。n,m&lt;=1000n,m&lt;=1000n,m<=1000,数字的数值范围<=101题解:又是日常刷水题,终于自己想出一道题,结果又因为各种细节写错,...原创 2018-12-17 19:35:04 · 163 阅读 · 0 评论 -
洛谷2178 BZOJ4199 NOI2015 品酒大会 SAM 树形dp
题面链接题意:给你一个字符串,每个位置有一个权值(可正可负),对于每一个i∈[0,n−1]i\in[0,n-1]i∈[0,n−1],求所有lcp长度为iii的后缀的对数,并且求每一对lcp为iii的后缀的两个权值相乘的最大值。长度为iii的lcp也可以算做长度是[0−i−1][0-i-1][0−i−1]。 n&lt;=1e5n&lt;=1e5n<=1e5。题解:怎么说...原创 2019-02-23 23:37:09 · 249 阅读 · 0 评论 -
洛谷4081 BZOJ5137 USACO2017DEC Standing Out from the Herd SAM
题目链接题意:给你nnn个字符串,要求你对于每个串求只在这个串出现过的本质不同的子串的个数。n&lt;=1e5,总串长&lt;=1e5n&lt;=1e5,总串长&lt;=1e5n<=1e5,总串长<=1e5。题解:这种本质不同的子串的问题基本上都是考虑用SA或者SAM来做的吧。这里我们考虑用SAM来做这个题。我们考虑原来对于一个串的时候怎么用S...原创 2019-02-25 11:08:33 · 140 阅读 · 0 评论 -
洛谷5212 BZOJ2555 SubString SAM LCT
题目链接题意:给出一个字符串,有两种操作,第一个是在当前字符串后面加上一个字符串,另一个是询问一个字符串在当前字符串中出现了多少次。总长度差不多是1e61e61e6级别的。题意:如果只有询问,求一个串在原串出现的次数的话,我们就只需要在SAM上走到询问串末尾在SAM上对应的点,然后查询parent树上子树内的结束点的个数就可以了。假如这个时候SAM上的每一个点在parent树上的子树结束点...原创 2019-02-26 19:21:37 · 124 阅读 · 0 评论 -
洛谷4770 BZOJ5417 NOI2018 你的名字 SAM 线段树合并
题目链接题意:给你一个字符串,有若干次询问,每次询问给你一个串和一对(l,r)(l,r)(l,r),问你询问串有多少个本质不同的子串没有在原串[l,r][l,r][l,r]区间内出现过。总询问串长&lt;=1e6&lt;=1e6<=1e6,单个串和原串长&lt;=5e5&lt;=5e5<=5e5题解:好像我NOI网上同步赛这个题爆零了,现在再来做...原创 2019-02-27 11:30:01 · 226 阅读 · 0 评论 -
洛谷5284 十二省联考 字符串问题 SAM 倍增 拓扑排序 排序
题目链接题意:给你一个长度为nnn的串,我们会从中选出nanana个子串作为AAA集合的串,选出nbnbnb个子串作为BBB集合的串。然后会有mmm组支配关系,每组支配关系给你一个在AAA集合中的子串的编号,一个在BBB集合中的子串编号,表示如果BBB对应的这个编号的子串是某一个AAA中的串的前缀的话,那个AAA中的串就可以接在当前AAA中的串的后面。问最长能接出多长的串,如果能无限长输出−1...原创 2019-04-10 18:23:29 · 317 阅读 · 0 评论 -
洛谷3346 BZOJ3926 诸神眷顾的幻想乡 SAM
题目链接题意:你有一棵树,每个点有一个权值,问有多少种权值排列不同的路径。点数1e5,权值&lt;=10,其中叶子节点不超过20个。题解:其实不难看出是个字符串题,相当于是给你一棵树,字符集大小是10,问你树上有多少种本质不同的字符串。还是考虑字符串神器SAM。SAM的最简性保证了不会有相同的子串出现,看起来就会对做这个题很有帮助。这个题有一个特殊的性质是叶子节点不超过20个,我们发现...原创 2018-12-07 11:40:09 · 127 阅读 · 0 评论 -
洛谷3181 BZOJ4566 HAOI2016 找相同字符 SAM
题目链接题意:给你两个字符串,求这两个字符串有多少对相同的子串,本质相同但位置不同算不同。串长<=2e5题解:我们考虑像以往一样对于第一个串建SAM,让第二个串在SAM上跑并统计答案,结果我们发现这样并不能做。。。于是这个题的做法是把两个串建成一个SAM,中间用一个特殊字符隔开。两个串建成一个SAM之后,我们发现可以对SAM形成的DAG拓扑排序,然后从拓扑序大的往拓扑序小的更新答案...原创 2018-12-04 09:50:59 · 184 阅读 · 3 评论 -
BZOJ1396 识别子串 SAM 线段树
题目链接题意:给定一个字符串S,对于一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件:1、i≤K≤j。2、子串T只在S中出现过一次。例如,S=“banana”,K=5,则关于第K位的识别子串有&quot;nana&quot;,“anan”,“anana”,“nan”,“banan&quot;和&quot;banana”。现在,给定S,求对于S的每一位,最短的识别子串长度是多少题解:原创 2018-12-06 11:51:04 · 157 阅读 · 0 评论 -
SPOJ7258 SUBLEX 后缀自动机
题目链接链接是洛谷有翻译的链接。题意:给你一个字符串,有T次询问,每次问你在整个字符串中排名为k的子串是哪一个。字符串长度&lt;=90000,T&lt;=500,只统计本质不同的串。题解:后缀自动机题,因为后缀自动机有着很强的处理子串的能力。看到排名第k,我们可能会想到主席树,但是显然主席树是没法维护具体某个字符串,但是主席树查询第k大的思想我们是可以使用的。主席树的方法是看左子树的...原创 2018-12-02 16:25:39 · 179 阅读 · 0 评论 -
洛谷3975 BZOJ3998 TJOI2015 弦论 后缀自动机
题目链接、题意:给你一个字符串,问你在算重复/不算重复的情况下第k大的字符串是什么,不存在输出-1。n<=5e5。题解:如果不算重复的话和这个题一样。看链接里的题解就行,我不再重复了。那么我们就讲一下算重复的做法。算重复其实就是要通过right来计算相同的情况,计算的方法和洛谷模板SAM的做法类似。都是在parent树上dfs,然后用子节点size更新父节点,其他的与可不算重复的一...原创 2018-12-02 21:07:23 · 155 阅读 · 0 评论 -
SPOJ8222 NSUBSTR - Substrings SAM
题目链接题意:给你一个字符串,求每个长度的字符串的最多出现次数。串长&lt;=250000题解:还是一个SAM题。应该做了之前那么多题之后,这个也不是那么难想了。我们对原串上的位置是SAM上标记,然后在parent树上dp,我们...原创 2018-12-05 07:56:52 · 111 阅读 · 0 评论 -
洛谷4248 BZOJ3238 AHOI2013 差异 SAM 树形dp
题目链接题意:给你一个字符串,TiT_iTi表示第iii个字符开始的后缀,求∑1&amp;lt;=i&amp;lt;j&amp;lt;=nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj)\sum_{1&amp;lt;=i&amp;lt;j&amp;lt;=n}len(T_i)+len(T_j)-2*lcp(T_i,T_j)∑1&lt;=i&lt;j&原创 2018-12-03 10:12:30 · 170 阅读 · 0 评论 -
洛谷3804 【模板】后缀自动机
题目链接题意:给你一个n个字符的字符串,求所有出现次数大于1的子串乘子串长度的最大值。n<=1e6题解:感觉全机房都早就会后缀自动机了啊,就我不会。而且感觉自己学得还不怎么样,似乎不是那么明白,感觉药丸。这个题的话建出后缀自动机之后,我们根据SAM的性质可知,一个点在parent树的子树中的叶子节点个数就是根到该节点的子串出现的次数。我们在建后缀自动机的时候已经求出了从根到每个节点...原创 2018-12-01 22:41:35 · 217 阅读 · 0 评论 -
SPOJ1811 LCS - Longest Common Substring 后缀自动机
题目链接链接是洛谷有翻译的。题意:给你两个长度不超过250000的字符串,求两个串的最长公共子串。题解:看起来是个比较经典的问题。似乎SAM处理子串的能力很强啊。做法是先对第一个串建出SAM,然后我们考虑parent树的含义,其实我觉得在某种意义下parent树可以理解为AC自动机的fail指针,因为它保证了子节点表示的字符串集合是父节点的一个真子集,所以如果在子节点匹配不上的话,下一...原创 2018-12-01 22:52:36 · 219 阅读 · 0 评论 -
洛谷4070 BZOJ4516 SDOI2016 生成魔咒 SAM map
题目链接题意:你有nnn次操作,每次往原串后面插入一个数,不同的数字看作不同的字符,问你每次加入一个字符之后有多少个不同的子串。n<=100000,数值范围1e9题解:数值范围太大,要离散化或者用个map。统计不同子串个数也算是SAM的一个经典应用了吧,SAM是可以在线回答的。我们假设之前的答案已经统计好了,那么考虑对于每次加入的数加进SAM之后产生的新串个数。我们知道,paren...原创 2018-12-03 11:21:58 · 118 阅读 · 0 评论 -
SPOJ8093 BZOJ2780 Sevenk Love Oimaster SAM
题目链接题意:给你nnn个字符串,有qqq次询问,每次给你一个字符串,求这个字符串在nnn个串中的多少个串中出现过。总串长都是1e5量级的,字符集是小写字母。题解:虽然据说AC自动机可能也可以做,但是显然没有用后缀自动机方便。我们对于这nnn个串建出SAM,然后我们要对于这个串的所有子串的出现次数都+1,...原创 2018-12-07 21:50:38 · 103 阅读 · 0 评论 -
SPOJ1812 LCS2 POI2000 BZOJ2946 公共串 SAM
题目链接链接是洛谷有翻译的。题意:给定一些字符串,求出它们的最长公共子串。输入至多10行,每行包含不超过100000个的小写字母。这题似乎和POI2000BZOJ2946是同一道题,于是我就也挂上那个标签了。PS:BZOJ的那个是个权限题。。。题解:我们之前做过两个串通过SAM找最长公共子串的,具体请看这里。那么我们考虑多个串的做法,其实多个串是可以从两个串拓展来的。思路上就是我们对...原创 2018-12-03 15:40:16 · 160 阅读 · 0 评论 -
SPOJ705 SPOJ694 Distinct Substrings SAM
SPOJ705SPOJ694题意:给你一个字符串,问你有多少个本质不同的字符串。其中SPOJ705是加强版,20组询问,每组n<=50000。题解:这个题异常坑爹!!!我调这个题调了一上午,心态爆炸。这个加强版没有说字符集大小,我以为是26,结果发现不是!回归正题,这个题的做法其实就是建出SAM,然后对于每个点,用它的串长减去parent树上它父节点的串长就行了,这样就可以不重不...原创 2018-12-04 14:56:18 · 125 阅读 · 0 评论