后缀自动机
fyc_kabuto
一个蒟蒻程序员
展开
-
4556: [Tjoi2016&Heoi2016]字符串(后缀自动机做法)
题目大意:给出两段区间,求其中一段的所有子串与另一段的最长公共前缀。 做法:听说可以用后缀数组作,不过忘得差不多了,与是愉快的敲了sam。好像还挺有收获的。 首先原串反过来建,这样题目就转化成了一段的所有子串与另一段的最长公共后缀,这样就可以识别了。 假设要在s【a,b】中找最长后缀在s【c,d】中出现过(反串后),那么我们先找到以b结尾的前缀在parent树上的位置, 接着我们二分答案m原创 2017-07-05 15:18:51 · 602 阅读 · 0 评论 -
loj 6031. 「雅礼集训 2017 Day1」字符串
题意: 题解: 因为保证qk&lt;105qk&lt;10^5qk<105,所以对于q<k,即q&lt;300q&lt;300q<300的点,直接sam+倍增O(mqlogn)O(mqlogn)O(mqlogn)然后就有90分了 对于k&lt;300k&lt;300k<300,暴力枚举每个子串,然后在vector上二分,看下...原创 2018-12-25 14:24:10 · 497 阅读 · 0 评论 -
codeforces 666E. Forensic Examination
题意: 给一些模式串,每次询问询问串的子串在[l,r][l,r][l,r]中的哪个模式串出现最多。 题解: 好久久久久久久久久久久久久没写字符串相关,调的简直心态爆炸。 直接建出广义sam,每次就相当于询问一个子树的众数。 用可持久化线段树合并即可。 具体细节见代码,线段树合并很久没写写错几次。 code: #include<vector> #include<cs...原创 2018-08-07 08:54:45 · 304 阅读 · 0 评论 -
计蒜客 A String Game
题意: 给出一个串t和n个t的子串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≤10^5,∑|s[i]|≤3∗107 题解: ...原创 2018-04-25 08:56:37 · 399 阅读 · 0 评论 -
bzoj 1921: [Ctsc2010]珠宝商
题意: 给一棵树,每个点上有一个字母,问对于所有(x,y),求x到y的路径所组成的字符串在S中出现次数的和。 题解: 先上题解:begined CTSC2010 珠宝商新解 然后说说个人的垃圾理解。 首先考虑暴力,一种显然的做法就是从每个点开始dfs整棵树,顺便在sam上走,那么每次加上right集合的大小即可。 然后考虑一种没那么显然的暴力。 枚举lca,然后将路径拆成,(x...原创 2018-04-12 09:33:34 · 474 阅读 · 0 评论 -
bzoj 4180: 字符串计数
题意: SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999。 他给出了一个字符串T,字符串T中有且仅有4种字符 ‘A’, ‘B’, ‘C’, ‘D’。现在他要求蒟蒻yts1999构造一个新的字符串S,构造的方法是:进行多次操作,每一次操作选择T的一个子串,将其加入S的末尾。 对于一个可构造出的字符串S,可能有多种构造方案,Oxer定义构造字符串S所...原创 2018-03-20 21:50:53 · 322 阅读 · 0 评论 -
bzoj 1396: 识别子串
题意: 给出一个字符串,对于每一个位置,求出最短的包含它的只在串中出现一次的子串长度。 题解: 建出sam,然后处理right集合为1的串。 然后线段树维护两个东西,一个以它为左端点,最靠左的合法右端点。 一个是直接包含的答案。 code: #include<cstdio> #include<cstdlib> #include<cstring>...原创 2018-03-19 20:54:31 · 235 阅读 · 0 评论 -
bzoj 5137: [Usaco2017 Dec]Standing Out from the Herd
广义SAM原创 2018-01-09 11:34:05 · 590 阅读 · 0 评论 -
bzoj 2555: SubString
题意:在线增加末尾字符,在线询问子串出现次数。题解:lct维护sam的right。 link时把x到根的路径标记一下,cut时也标记一下。 自己YY的竟然能A。 话说我的lct好慢啊。 code:#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; struct原创 2017-08-26 18:30:51 · 322 阅读 · 0 评论 -
3172: [Tjoi2013]单词
后缀自动机模板题。 2012年noi冬令营陈立杰讲稿(SAM后缀自动机) 这个写的不错,一定要耐心看。 code: #include #include #include #include using namespace std; struct SAM{ int par,max,a[28]; }sam[2500000];int root=1,tot=1,tail=1,ri[2原创 2017-07-09 08:47:16 · 374 阅读 · 0 评论 -
bzoj 3879: SvT
题目大意:求若干个后缀两两减的LCP之和。后缀总和不大于3*10^6; 后缀自动机加虚树。 看这种询问有多,总点不太多的又在一棵树上可以考虑虚树。 把原串反过来,等于求前缀的最长公共后缀。 首先有个显然的性质是两个前缀的LCS是它们在parent树上的lca的max。如果不了解的可以先做这题:点击打开链接 见虚树后,跟bzoj3238一样,在树上统计答案就行了。 ans要除二,因为两两原创 2017-07-15 11:11:06 · 310 阅读 · 0 评论 -
uoj 395. 【NOI2018】你的名字
题意: 给出一个模式串SSS,多次询问询问串有多少本质不同的子串在s[l,r]s[l,r]s[l,r]中没有出现。 题解: 这题好像不是很难 首先68分比较sb,对于每个TTT的前缀,只要能求出最短的还没有在TTT中出现过的,和最短的还没有在SSS中出现过的后缀,就能计算这个前缀的贡献。 转为求最长的出现过的,就是sam经典操作。 现在加上了l,rl,rl,r这个限制,影响的只有在SSS中的的部分...原创 2019-01-24 11:14:38 · 364 阅读 · 2 评论