后缀自动机
200815147
这个作者很懒,什么都没留下…
展开
-
HDU6054 String and String 广义后缀自动机+树状数组套线段树
存一下代码。广义SAM是正版的。Code#pragma comment(paintr, "/STACK:102400000,102400000") #include<bits/stdc++.h>using namespace std;#define LL long long#define pa pair<int,int>const int Maxn=400010,N=390;const int inf=2147483647;const double pi=acos原创 2021-02-28 16:09:01 · 282 阅读 · 0 评论 -
[LOJ]#2720. 「NOI2018」你的名字 后缀自动机+主席树
Solution首先讲一下一个68分的水法:建广义SAM,然后每次询问完之后暴力撤销,复杂度未知。这种做法本身复杂度好像就不对,而且也没法扩展,考虑另外的做法。考虑每个询问串前缀的贡献。首先要保证本质不同,所以先求出每个前缀的最短的没有在之前出现过的后缀,这个可以对每个询问串建SAM求。然后要求出每个前缀的最短的没有在SSS出现过的后缀,如果是68分,相当于在SSS的SAM上匹配,求最长匹配...原创 2019-04-13 17:00:09 · 387 阅读 · 0 评论 -
[Codeforces] 1037 H. Security 后缀自动机+主席树
Solution这题思路还是比较简单的。由于∑∣S∣\sum|S|∑∣S∣较小,所以可以枚举答案前多少位是和给出的串是一样的,再枚举下一位填什么,这样问题就转化为快速判断一个区间中某个字符串是否出现过。把parent树建出来后,就是询问某个点子树中有没有值域在某个范围内的点,可以用主席树解决。需要注意的是,当询问长度为lenlenlen的串是否在[l,r][l,r][l,r]中出现时,询问...原创 2019-04-11 17:26:48 · 355 阅读 · 0 评论 -
[BZOJ]4180: 字符串计数 SAM+矩阵乘法+二分
DescriptionSD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999。他给出了一个字符串T,字符串T中有且仅有4种字符 ‘A’, ‘B’, ‘C’, ‘D’。现在他要求蒟蒻yts1999构造一个新的字符串S,构造的方法是:进行多次操作,每一次操作选择T的一个子串,将其加入S的末尾。对于一个可构造出的字符串S,可能有多种构造方案,Oxer定义构造...原创 2019-03-14 17:37:06 · 258 阅读 · 0 评论 -
[BZOJ]4032: [HEOI2015]最短不公共子串 SAM+DP+hash
Description在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。下面,给两个小写字母串A,B,请你计算:(1) A的一个最短的子串,它不是B的子串(2) A的一个最短的子串,它不是B的...原创 2019-01-16 22:34:38 · 188 阅读 · 0 评论 -
Codeforces 1073G. Yet Another LCP Problem SAM+虚树
Solution很套路的一道题。后缀的LCPLCPLCP可以变为前缀的LCSLCSLCS,那么建出SAM之后就转化为一个树上问题,即统计所有给出点对的LCALCALCA权值和,由于多个询问,建虚树即可。Code#include<bits/stdc++.h>using namespace std;#define LL long long#define pa pair<...原创 2019-01-13 19:39:48 · 348 阅读 · 0 评论 -
4310: 跳蚤 后缀自动机+二分+hash
Description 很久很久以前,森林里住着一群跳蚤。一天,跳蚤国王得到了一个神秘的字符串,它想进行研究。首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个,并在选出来的 k 个子串中选择字典序最大的那一个。他称其为“魔力串”。现在他想找一个最优的分法让“魔力串”字典序最大。题解:首先可以用sam求出给定的串有多少个本质不同的子串,...原创 2018-04-24 07:25:04 · 308 阅读 · 0 评论 -
Codeforces 547E. Mike and Friends 后缀自动机+离线+线段树
题解:感觉这道题其实很套路啊。反正我看完题就想到了一个做法:建广义sam,离线,然后加个主席树,维护right集合,复杂度是O(nlog2n)O(nlog2n)O(nlog^2n)的,不仅时间不优秀,而且会MLE。其实离线拆询问,用一个线段树维护子树和(也就是right集合)就行了,还是太菜啊。代码:#include<bits/stdc++.h>using names...原创 2018-03-20 18:46:45 · 555 阅读 · 0 评论 -
3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日。 粉丝们非常热情,自发组织表演了一系列节目给幽香看。幽香当然也非常高兴啦。 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地。在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来。也就是说,这n块空地形成了一个树的结构。...原创 2018-03-12 22:01:45 · 164 阅读 · 0 评论 -
后缀自动机题表
SPOJ1811:求两个串的最长公共子串,入门题。 8222:简单。BZOJ2946:多个串的最长公共子串。 3998:第K小子串,预处理出每个节点能走出多少字串即可解决。 2882:将串复制一遍,然后走最小的,走n次即可,son用map。 4516:简单。 1396:求出right集合为1的节点后用线段树维护答案。 2780:广义后缀自动机。 3172:广义后缀自动...原创 2018-02-08 10:56:37 · 354 阅读 · 0 评论 -
3238: [Ahoi2013]差异 后缀自动机
Description 题解:哈哈这道题自己YY出来了很开心(不过OZY大神告诉我与LCA有关)。最长公共前缀稍微想想都觉得很难搞,毕竟是后缀自动机,所以把原字符串反过来建,然后变成了求最长公共后缀。对于两个后缀,若他们在后缀自动机上对应的节点分别为xxx和yyy,那么他们的最长公共后缀长度就是mx[lca(x,y)]mx[lca(x,y)]mx[lca(x,y)](这里的lca指的...原创 2018-02-08 10:54:39 · 244 阅读 · 0 评论 -
3277/3473:串 后缀自动机
Description字符串是oi界常考的问题。现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身)。题解:首先建出广义后缀自动机,建的时候顺便预处理每个节点代表的串在多少个字符串中出现,预处理的方法和2780是一样的。然后用f[i]" role="presentation" style="position: relat原创 2018-02-07 11:47:57 · 240 阅读 · 0 评论 -
[BZOJ]3172: [Tjoi2013]单词 AC自动机(或广义后缀自动机)
Description某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。题解:建AC自动机,对于每个单词,建的时候在路径上的每个点+1,表示这个前缀出现了一次;对于后缀,直接在每个点的fail上加上这个点上的出现次数就好了。 Update: 也可以用广义后缀自动机做,直接建出广义后缀自动机,然后统计right"原创 2017-09-15 13:02:27 · 627 阅读 · 0 评论 -
3998: [TJOI2015]弦论 后缀自动机
Description对于一个给定长度为N的字符串,求它的第K小子串是什么。题解:这道题感觉真的很入门啊……建出后缀自动机,对于T=0T=0T=0,默认所有节点的rightrightright集合为1,对于T=1T=1T=1,就直接正常求出rightrightright集合,然后对每个点求个Sum[x]Sum[x]Sum[x],表示xxx节点开始有多少个子串,然后类似主席树找第kk...原创 2018-02-04 21:39:21 · 239 阅读 · 0 评论 -
2946: [Poi2000]公共串 后缀自动机
Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度。任务: l 读入单词 l 计算最长公共子串的长度 l 输出结果题解:初学后缀自动机,讲得可能不是很好……首先建出第一个串的后缀自动机,然后其他串在上面匹配,用tmp[i]" role="presentation" style="position原创 2018-02-04 21:31:25 · 207 阅读 · 0 评论