后缀自动机
Cyhlnj
这个作者很懒,什么都没留下…
展开
-
后缀自动机板子和一些用法
后缀自动姬是什么? 博主不想写反正没人看 直接去hihocoderhihocoderhihocoder 概念1 算法2模板# include <bits/stdc++.h># define IL inline# define RG register# define Fill(a, b) memset(a, b, sizeof(a))using names...原创 2018-04-17 21:27:09 · 333 阅读 · 0 评论 -
CF235C Cyclical Quest
题意给定一个长度为nnn的母串 qqq组询问 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其旋转的串在给定的串中出现了多少次Sol旋转就把它复制一遍接在后面 然后就在samsamsam上匹配 跳parentparentparent树的父亲到最后一个长度大于等于询问串长 然后统计sizesizesize 防止重复算,就标记一下这个点是否算过# in...原创 2018-04-25 19:06:34 · 181 阅读 · 0 评论 -
Bzoj3998: [TJOI2015]弦论
题面传送门Solsamsamsam 求一个串的不重复的第kkk小子串很好办 如果可以相同 那么要算上每个点(前缀)的后缀的个数 那么就是这个endpos(right)endpos(right)endpos(right)集合的子串的出现次数# include <bits/stdc++.h># define IL inline# define RG regi...原创 2018-04-21 15:27:16 · 122 阅读 · 0 评论 -
SPOJ:SUBLEX - Lexicographical Substring Search
题面第一行给定主串(len<=90000)(len<=90000)(lenT<=500T<=500TTTT行TTT个询问,每次询问排名第kkk小的串,范围在intintint内 相同的子串算一个Solsamsamsam中每条从起点出发的路径都对应一个子串 设f[i]f[i]f[i]表示从iii出发的路径的条数 f[i]=1+∑j∈trans[i]f[j]f...原创 2018-04-21 14:17:58 · 195 阅读 · 0 评论 -
Bzoj4516: [Sdoi2016]生成魔咒
题面bzojSolsamsamsam 维护一下不同子串的个数就好了 开mapmapmap# include <bits/stdc++.h># define IL inline# define RG register# define Fill(a, b) memset(a, b, sizeof(a))# define File(a) freopen(a"....原创 2018-04-21 14:13:20 · 126 阅读 · 0 评论 -
SPOJ:NSUBSTR - Substrings
题面字符串SS S 最多包含2525 25 万个小写拉丁字母。我们将F(x)F(x) F(x) 定义为长度为xx x 的某些字符串出现在ss s 中的最大次数。例如,对于字符串“ababa”“ababa” “ababa”,F(3)F(3)F(3) 将为22 2,因为存在两次出现的字符串“aba”“aba” “aba”。您的任务是为每个ii i 输出 F(i)F(i)F(i),以便1<=i...原创 2018-04-21 14:11:21 · 245 阅读 · 0 评论 -
SPOJ:LCS2 - Longest Common Substring II
题面给定一些字符串,求出它们的最长公共子串 输入格式 输入至多 101010 行,每行包含不超过 100000100000100000个的小写字母,表示一个字符串 输出格式 一个数,最长公共子串的长度 若不存在最长公共子串,请输出 000 Sol一个串建立samsamsam 每个串在上面匹配 每个点匹配的长度可以由后继转移过来 拓扑序上DPDPDP# include ...原创 2018-04-21 14:07:48 · 122 阅读 · 0 评论 -
SPOJ: LCS - Longest Common Substring
题面输入222个长度不大于250000250000250000的字符串,输出这222个字符串的最长公共子串。如果没有公共子串则输出000Sol一个串建立samsamsam 另一个串在上面匹配# include <bits/stdc++.h># define IL inline# define RG register# define Fill(a, b) ...原创 2018-04-21 14:05:12 · 206 阅读 · 0 评论 -
Luogu3804:[模板]后缀自动机
题面luoguSolsamsamsam然后树形DPDPDP 当时还不会拓扑排序的我# include <bits/stdc++.h># define IL inline# define RG register# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef lon...原创 2018-04-21 14:03:09 · 177 阅读 · 0 评论 -
HDU4622: Reincarnation
题面给定一个串,每次询问l rl rl~r组成的子串的不同子串个数 串长200020002000Sol每个左端点建一个samsamsam同时记录答案# include <bits/stdc++.h># define IL inline# define RG register# define Fill(a, b) memset(a, b, si...原创 2018-04-21 11:53:52 · 180 阅读 · 0 评论 -
Bzoj2780: [Spoj]8093 Sevenk Love Oimaster
题目传送门Sol就是广义samsamsam 然后记录下每个状态属于哪些串,开setsetset维护 parentparentparent树上启发式合并一下就好了# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeo...原创 2018-04-25 10:52:28 · 214 阅读 · 0 评论 -
Bzoj3277:串
题面传送门Sol广义samsamsam 每个samsamsam的状态开setsetset记录属于哪些串 parentparentparent树上启发式合并setsetset然后每个串就在上面走,通过不停地跳parentparentparent树的父亲节点保证大于等于kkk,贡献就是lenlenlen# include <bits/stdc++.h># ...原创 2018-04-24 21:03:27 · 271 阅读 · 0 评论 -
Bzoj2882: 工艺
题面luogu不用权限Solsasasa的话就直接连在一起后缀排序就好了 samsamsam就插入两次,贪心在上面走就好了# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namesp...原创 2018-04-24 17:16:21 · 175 阅读 · 0 评论 -
Bzoj3926: [Zjoi2015]诸神眷顾的幻想乡
题面传送门Sol求多个串的不同子串的个数广义后缀自动机 也就是可以表示所有的串的所有的后缀的自动机那么每次建一个串后,另外一个串接在初始节点下面建就好了叶子节点最多202020个 那么对于每个叶子结点遍历一遍树建立samsamsam 注意回溯时要把lastlastlast指回来# include <bits/stdc++.h># define R...原创 2018-04-24 13:05:29 · 171 阅读 · 0 评论 -
Bzoj3238: [Ahoi2013]差异
题面BzojSol刚完品酒大会那道题后再看这道题发现这就是道SBSBSB题 后缀数组+并查集 按heightheightheight从大到小做 heightheightheight是两个相邻rankrankrank的后缀的LCPLCPLCP 从大到小,那么每次合并heightheightheight的两边的集合,同时记录答案 两边集合两两配对的LCPLCPLCP一定就是这...原创 2018-02-22 17:08:28 · 235 阅读 · 0 评论 -
Bzoj2555: SubString
题面传送门Sol考虑求每个串在模板串中出现的次数 就在samsamsam上走就行了,因为它的每一条路径都是它的一个子串 走到最后一个点,若匹配,那么它的答案就是parentparentparent树的这个点的子树大小然后带修改就写个LCTLCTLCT维护parentparentparent树就好了 LCTLCTLCT维护子树信息,非常好写# include &amp;amp;amp;lt...原创 2018-04-23 19:18:42 · 270 阅读 · 0 评论 -
CF700E Cool Slogans
题意给出一个长度为 nnn 的字符串 s[1]s[1]s[1],由小写字母组成。定义一个字符串序列 s[1....k]s[1....k]s[1....k] ,满足性质:s[i]s[i]s[i] 在 s[i−1]s[i−1]s[i-1] (i≥2)(i≥2)(i \ge 2) 中出现至少两次(位置可重叠),问最大的 kkk 是多少,使得从 s[1]s[1]s[1] 开始到 s[k]s[k]s[k...原创 2018-06-12 15:37:17 · 267 阅读 · 0 评论