后缀自动机
_beginend
这个作者很懒,什么都没留下…
展开
-
bzoj 3238: [Ahoi2013]差异 后缀自动机
题意 n<=500000分析题目其实就是要求sigma(1<=i,j<=n) lcp(Ti,Tj) 我们将字符串建立一棵后缀自动机,那么两个前缀的lcp就是其在parents树上的lca的最长子串。 树形dp一下即可。 这是本蒟蒻第一道SAM的题目,在此发表一下对SAM的理解。 代码一点都不复杂,只是要看懂确实要花蛮大的功夫,从cls60+页的课件就可以看出来。 首先SAM上每个节点都包原创 2017-02-22 20:25:25 · 506 阅读 · 0 评论 -
bzoj 4180: 字符串计数 后缀自动机+倍增floyd
题意SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999。 他给出了一个字符串T,字符串T中有且仅有4种字符 ‘A’, ‘B’, ‘C’, ‘D’。现在他要求蒟蒻yts1999构造一个新的字符串S,构造的方法是:进行多次操作,每一次操作选择T的一个子串,将其加入S的末尾。 对于一个可构造出的字符串S,可能有多种构造方案,Oxer定义构造字符串S所需原创 2018-01-10 15:52:43 · 598 阅读 · 0 评论 -
bzoj 4545: DQS的trie 广义后缀自动机+离线+树状数组
题意DQS的自家阳台上种着一棵颗粒饱满、颜色纯正的trie。 DQS的trie非常的奇特,它初始有n0个节点,n0-1条边,每条边上有一个字符。并且,它拥有极强的生长力:某个i时刻,某个节点就会新生长出一颗子树,它拥有si个节点且节点之间的边上有一个字符,并且新生长出来的子树也是一个树结构。然而因为是新长出来的,根据生活常识可知si必定不会大于i时刻之前的树的大小。 DQS定义trie的子原创 2018-01-10 21:44:13 · 535 阅读 · 0 评论 -
bzoj 2806: [Ctsc2012]Cheat 广义后缀自动机+单调队列优化dp
题意给出N个字符串Si和M个字符串Ti,要求对于每一个字符串Si求出一个最大的整数L,使得可以将Si分割成若干个连续的段,其中是某个Ti的子串且长度不小于L的段长的总和不小于|Si|*0.9。分析先对所有Ti建广义sam,然后把Si在sam上跑,求出g[i]表示以i为结尾的前缀最多可以匹配多少长度。 求g[i]具体的方法是,把整个串在sam上跑,设当前匹配到str[p-1]且位于...原创 2018-03-09 21:45:26 · 327 阅读 · 0 评论 -
Codeforces 666E Forensic Examination 广义后缀自动机+线段树合并+倍增
题意给出一个长度为n的字符串S,和M个字符串Ti。有Q组询问,每次询问给出四个参数a,b,c,d,问S[a..b]在T[c..d]这些字符串中作为子串出现最多次数的T是哪一个,并求出出现次数。 N<=500000 M<=50000 Q<=500000 字符串T总长度不超过50000分析先把所有串扔到一起建广义sam,然后对于每个节点用线段树维护每一个Ti的...原创 2018-03-10 15:18:40 · 600 阅读 · 0 评论 -
bzoj 1921: [Ctsc2010]珠宝商 后缀自动机+点分治
题意有一棵n个节点的树和一个长度为m的字符串S,树上每个节点有一个字符。问对于任意的有序数对(x,y),从x到y路径组成的字符串在S中出现次数的和。 n,m<=50000n,m<=50000n,mO(1)O(1)O(1)的,所以这么做总的复杂度是O(n2)O(n2)O(n^2)。暴力2:我们考虑求每个点作为路径的lca时候的贡献。设路径的lca为点Z,那么对于一条路径(X,Y...原创 2018-03-31 07:49:21 · 939 阅读 · 1 评论 -
计蒜客 A String Game SG函数+后缀自动机
题意给出一个串ttt和nnn个ttt的子串s[1..n]s[1..n]s[1..n]。两个人轮流操作,每次可以选择一个串s[i]s[i]s[i],然后在s[i]s[i]s[i]的最后添上一个字符串,满足得到的新串仍然是t的子串。不能操作者输,问先手必胜还是后手必胜。 t≤105,∑|s[i]|≤3∗107t≤105,∑|s[i]|≤3∗107t\le10^5,\sum |s[i]|\le3*...原创 2018-04-23 19:48:47 · 258 阅读 · 0 评论 -
LibreOJ #6041.「雅礼集训 2017 Day7」事情的相似度 后缀自动机+set启发式合并+扫面线+树状数组
题意给一个长度为n的01串,每次询问给出一个区间[l,r],问所有结束位置在[l,r]中的前缀,两两lcs的最大值是多少。 n,m≤105n,m≤105n,m\le10^5分析显然一个前缀对(x,y)能贡献到所有满足l≤x,y≤rl≤x,y≤rl\le x,y\le r的询问[l,r][l,r][l,r]。 两个前缀的lcs等价于其在sam的parents树上lca的mx。那么...原创 2018-05-08 14:40:48 · 548 阅读 · 0 评论 -
Codechef KILLKTH 后缀自动机+后缀树
题意给一个长度为n的字符串,把这个串的所有子串按字典序排序后拼到一起组成一个新串,每次询问新串的某个字符是什么。 n≤200000n≤200000n\le200000,强制在线。分析先通过建反串的后缀自动机把原串的后缀树建出来,不难发现把子串按字典序排序等价于求出后缀树的dfs序。 那么我们只要在dfs序上二分出对应节点,然后在对应节点里面算一算就好了。代码#i...原创 2018-06-11 20:27:57 · 446 阅读 · 0 评论 -
LibreOJ #6031.「雅礼集训 2017 Day1」字符串 后缀自动机
题意给一个长度为nnn的字符串SSS和mmm个区间[li,ri][li,ri][l_i,r_i],有qqq个询问,每个询问会给出一个长度为kkk的字符串TTT和区间[a,b][a,b][a,b],求∑i=abw(S,T,li,ri)∑i=abw(S,T,li,ri)\sum_{i=a}^bw(S,T,l_i,r_i) 其中w(S,T,l,r)w(S,T,l,r)w(S,T,l,r)表示T[l...原创 2018-06-22 11:34:22 · 749 阅读 · 0 评论 -
Codeforces 1037H Security 后缀自动机+线段树
题意给一个长度为n的字符串s,有q次询问,每次询问给出一个区间和一个字符串t,求区间中字典序最小的子串使得该子串的字典序大于t。 n≤105,q≤2∗105n≤105,q≤2∗105n\le10^5,q\le2*10^5。分析无聊模版题。 先预处理出sam上的right集线段树,枚举答案串和t的lcp长度,再枚举下一个字符是什么,然后直接在线段树上查找即可。 时间复杂度O(n...原创 2018-09-09 17:25:23 · 750 阅读 · 1 评论 -
UOJ #395. 【NOI2018】你的名字 后缀自动机
题意给一个串S,每次询问给出一个串T和区间[l,r],问T中有多少个不同的子串满足其不是S[l…r]的子串。∣S∣,∣T∣≤5∗105,q≤105,∑∣T∣≤106|S|,|T|\le5*10^5,q\le10^5,\sum |T|\le10^6∣S∣,∣T∣≤5∗105,q≤105,∑∣T∣≤106分析在noi考场上打了个又臭又长的做法,还只有68分。正解其实并不算难。先补集转化一下,...原创 2018-10-14 16:22:50 · 3969 阅读 · 0 评论 -
Codeforces 700E Cool Slogans 后缀自动机+可持久化线段树+dp
题意给你一个长度为n的字符串S,求最长的一个字符串序列a[1..k]a[1..k]满足序列中的每一个字符串都是S的子串,且对于任意的1i=k1都有a[i−1]a[i-1]在a[i]a[i]中至少出现两次。两次出现允许重叠。 问最大满足条件的k是多少。 n分析一开始也想到了类似的做法,但发现有点问题,于是就去膜lyc大爷的标。 首先想到可以dp,设f[str]表示字符串str作为a原创 2018-01-23 15:31:43 · 1784 阅读 · 1 评论 -
bzoj 2555: SubString 后缀自动机+lct
题意懒得写背景了,给你一个字符串init,要求你支持两个操作 在当前字符串的后面插入一个字符串 询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作。 100 % 的数据字符串最终长度 分析直接把sam建出来然后用lct维护链上权值修改即可。代码#include#include#include#include#include原创 2018-01-11 17:12:23 · 252 阅读 · 0 评论 -
bzoj 2946: [Poi2000]公共串 后缀自动机
题意给出几个由小写字母构成的单词,求它们最长的公共子串的长度。 任务: l 读入单词 l 计算最长公共子串的长度 l 输出结果 1<=n<=5,表示单词的数量,单词只由小写字母组成,单词的长度至少为1,最大为2000。分析先对第一个字符串构建sam,然后对于其余每个串,记录每个位置在后缀自动机上匹配到的最大长度,然后有一个特别关键的转移就是每个儿子原创 2017-02-23 19:42:46 · 385 阅读 · 0 评论 -
bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡 后缀自动机
题意给出一棵树,求这棵树上有多少不同的子串。 n<=100000,c<=10分析考虑到叶节点数量不超过20个,有一个神奇的结论就是每个串必然是以某个叶节点为根的树上的一条链。那么就以每棵树为根建一棵后缀自动机,并把所有后缀自动机合并成一个,然后直接统计答案即可。 真的觉得后缀自动机好强大啊!!!代码#include<iostream>#include<cstdio>#include<cstd原创 2017-02-23 20:35:11 · 370 阅读 · 0 评论 -
bzoj 3998: [TJOI2015]弦论 后缀自动机
题意对于一个给定长度为N的字符串,求它的第K小子串是什么。 n<=5*10^5分析再次见识到了sam的各种妙用。 首先对原串建一棵后缀自动机,然后每走一步就相当于枚举了一个子串。用一个f[i]记录节点i的right集大小,sum[i]记录以i为根可以得到多少个子串,然后递归查找答案即可。代码#include<iostream>#include<cstdio>#include<cstdlib>原创 2017-02-24 20:16:51 · 274 阅读 · 0 评论 -
bzoj 4566: [Haoi2016]找相同字符 后缀自动机
题意给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两个子串中有一个位置不同。 1 <=n1, n2<= 200000分析一眼就想到了用sam,显然一个建一个跑,只是没那么快想到具体怎么做而已。。。 可以预处理处每个点的right集大小,设为f[i],然后把第二个串在sam上面跑。 若跑到一个节点,设当前长度为len,节点的合法长度区间为[mn原创 2017-04-07 17:06:06 · 625 阅读 · 0 评论 -
bzoj 3473: 字符串 广义后缀自动机
题意给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 1<=n,k<=10^5,所有字符串总长不超过10^5,字符串只包含小写字母。分析一开始的想法是,把所有串连起来建sam,然后用线段树合并来维护。 看了题解,发现可以建广义sam,然后用set启发式合并即可。虽然时间复杂度比较大,但是代码量比较小,于是果断去打了一发(懒癌晚期)。 一开始按标打广原创 2017-04-08 11:44:36 · 604 阅读 · 0 评论 -
bzoj 3676: [Apio2014]回文串 manachar+后缀自动机+倍增(回文树)
题意考虑一个只包含小写字母的字符串s。我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度。请你求出s的所有回文子串中的最大出现值。 n<=300000分析因为自己对马拉车的性质不太熟悉,所以一开始没做出来。 考虑在跑马拉车算法的时候,所有本质不同的回文串必然包含在所有能使mx增加的回文串内,也就是最多只有O(n)个。那么我们只要求出后缀自动机,然后每找到一个回文串就扔进后缀自原创 2017-04-09 20:47:28 · 473 阅读 · 0 评论 -
bzoj 4032: [HEOI2015]最短不公共子串 后缀自动机+序列自动机+bfs+记忆化搜索
题意在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。 一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。 下面,给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (原创 2017-09-16 10:24:19 · 433 阅读 · 0 评论 -
bzoj 3879: SvT 后缀自动机+虚树+树形dp
题意有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置来表示),求这些后缀两两之间的LCP(LongestCommonPrefix)的长度之和.一对后缀之间的LCP长度仅统计一遍. 有S<=5*10^5,且Σt<=3*10^6.分析我们把S反过来后建后缀自动机,就转换成了求两两前缀的lcs。显然两个前缀原创 2017-11-09 17:02:18 · 550 阅读 · 0 评论 -
51nod 1647 小Z的trie 广义后缀自动机+倍增
题意NOIP编号为ZJ-267的小Z在NOIP中AK啦! 小Z打算去冲击省选,于是开始学习trie。 有一天,他得到了N个字符串。 他先建立一个根节点,对于每一个字符串,他都从根节点开始一点点插入。 小Z不满足于此。他的大脑里盘旋着M个问题: 如果给定一个二元组(s,t)(s,t都是trie中的节点且s是t的祖先), 存在多少个二元组(x,y)(x,y都是trie中的节点且x是y的原创 2017-11-01 15:56:20 · 773 阅读 · 0 评论 -
51nod 1600 Simple KMP 后缀自动机+树链剖分+线段树
题意对于一个字符串|S|,我们定义fail[i],表示最大的x使得S[1..x]=S[i-x+1..i],满足(x分析首先我们来分析一下这道题的各种性质。 f(S)就相当于每个前缀在原串中出现的次数(不包括前缀本身)。 不难发现key(S)就相当于每个非空子串S的f(S)*(n-pos[S]+1)的和,pos[S]表示S结尾字符的位置。 假设我们维护出了当前S每个子串S的f(S)的和,设为to原创 2017-11-01 17:20:38 · 862 阅读 · 0 评论 -
bzoj 3413: 匹配 后缀自动机
题意n≤100000n\le100000n≤100000分析题目相当于求询问串与母串的第一个匹配位置之前所有后缀的lcp的和。对母串建sam,把每个节点的right集用线段树合并求出来,然后把询问串在上面跑顺便统计答案就好了。代码#include<iostream>#include<cstdio>#include<cstdlib>#inclu...原创 2019-07-02 09:52:34 · 310 阅读 · 0 评论