随笔分类 - 字符串
摘要:神题啊... 首先我们考虑68分的暴力: 对于询问串的每个位置,我们维护一个表示以为终点向前至多能与模式串匹配多长,这一点可以在把询问串放在模式串的后缀自动机上跳跃得到 接下来考虑统计答案: 对于询问串同样建起一个后缀自动机,我们知道后缀自动机上的每个节点维护的位置是一
阅读全文
摘要:考察后缀自动机的性质:每个节点上维护的子串数量等于自己与父节点的之差 据此,我们在建后缀自动机的时候,对于每个插入的节点加上他与父节点的之差即可 什么?分裂出来的节点怎么办?无所谓!不累计! 因为假设我们有一个点,其父亲为,分裂出的节点为,那么我们知道,进行这次
阅读全文
摘要:多有趣的一道题啊... 考场上的思路: 首先我们可以通过hash判断出每个类串是几个类串的前缀,从这个类串向对应的类串连边 然后我们直接按支配关系从类串向类串连边,相当于以类串为中转构造了一张类串的图,在这张图上跑一次最长路即可 这样做是40分(所以4
阅读全文
摘要:后缀自动机基本应用 对询问串建起后缀自动机,然后建起parent树,做一次子树统计就知道了每个节点代表的字符串出现次数 接下来我们只考虑出现次数等于的那些点,对于任意一个点我们知道他代表的子串长度是连续的,长度范围在之间,那么我们做个差分,最后
阅读全文
摘要:首先简化一下题意: 求一个字符串的子序列个数,要求这个子序列满足:是一个回文序列,且在原串中不连续 怎么搞? 设这个字符串为S 首先上一个容斥:我们找出所有回文子序列,然后减去连续的部分即可 而连续的部分可以用manacher算出来 所以我们重点研究一下如何找出所有回文子序列 首先我们回到manac
阅读全文
摘要:我们分成两种情况来分析这个问题:t=0和t=1 t=1时,每一个子串出现的次数就是他在parent树上所在子树内前缀节点的个数,这一点我们已经说的很清楚了 利用SAM有向无环的性质,我们可以在parent树上统计完之后在后缀自动机上dfs,对每个点累计以他为开头的所有子串的总数 然后在查询的时候直接
阅读全文
摘要:上一篇我们具体介绍了后缀自动机的构造方式,但并没有谈它的应用,那么我们在这一篇里详细谈一谈后缀自动机的应用 首先,后缀自动机的性质:从根节点开始可以识别一个字符串的所有子串 接下来,我们需要给出一个定义: 将后缀自动机上的pre指针反指,会得到一棵树形结构,我们把这棵树叫做parent树! pare
阅读全文
摘要:学了一周后缀自动机,觉得...好难啊(主要还是自己太弱了...) 看见网上很多大佬的讲解,感觉总是有些似懂非懂,索性一起拿出来做一个总结,可能效果会好一些 首先,我们能看到这样一个定义: 后缀自动机是一个的确定性有限状态自动机,能接受这个字符串的所有后缀 然后就不知道了...... (不得不承认,对
阅读全文
摘要:十分之恶心的后缀自动机 (其实是水题,但是我太弱了...) 首先,有一个预备知识:bzoj 2780https://blog.csdn.net/lleozhang/article/details/89365183 现在我们假定你会了这道题 然后我们来讨论这个问题: 套路是一样的:仍然建起广义后缀自动
阅读全文
摘要:后缀自动机的应用 首先我们观察到:如果一个询问串的答案不为0,那么这个串一定是至少一个模式串的子串 如果只有一个模式串,那么这个问题可以简单地用什么东西解决掉(比如普通后缀自动机) 而这里有很多模式串,所以普通后缀自动机是不够的。 那么我们提出广义后缀自动机 所谓广义后缀自动机,可以简单理解成将很多
阅读全文
摘要:后缀数组+单调栈的应用 首先我们研究一下这个表达式,可以发现前半部分与串的情况并没有关系,而只是跟串的长度有关,所以我们先把前半部分算出来: 于是我们只需计算出即可 那么可以发现,对于排名分别为i,j的两个串,他们的lcp应当是: 但是这里的时间复杂度仍然很大 我们换一个角度来思考:如果设,那么我们
阅读全文
摘要:题意:给出两个字符串,求这两个子串中最长相同子串长度 策略: 首先,我们可以将这两个字符串首尾相接,这样我们就可以获得一个长字符串,然后我们对这个新串求出height数组,然后枚举所有height并且找出两个sa,查出这两个sa是否在两个串内,这样就可以了如果是的话就用height更新ans即可 还
阅读全文
摘要:vjudge原地爆炸... 题意:求一个字符串不同的子串的个数 策略:后缀数组 利用后缀数组的sa和height两个功能强大的数组,我们可以实现上述操作 首先有个很显然的结论:一个字符串的所有子串=它后缀的所有前缀 这是很显然的,因为一个后缀的前缀遍历了所有以该后缀起点为起点的字符串的子串,那么如果
阅读全文
摘要:秒掉2/8的男人... 这题也是考察的后缀数组基础应用:可重叠至少重复k次的最长子串 显然还是对height数组应用于二分答案的检验 二分一个长度,然后用height数组检验即可 注意:不能单纯看height数组中出现某个值的次数,而是要关注height数组中连续出现某个值的次数,否则无法判断这个公
阅读全文
摘要:激动ing...我完成了1/8的男人... 其实不难,但我交了3页WA,原因是我为防RE特判n=1直接输出,并没有读入!!! 题意:给定一个长为n的序列,定义该序列的两个子序列(连续)相似,当且仅当这两个子序列长度相同且互不重叠,而且这两个子序列每个序列内部相邻元素前后做差,将所有差值排列成一个序列
阅读全文
摘要:后缀数组是一个很迷的字符串算法... 后缀数组的特点是:思想嘛...还行 代码嘛...很乱 首先做一些基础介绍: 后缀数组(sa)是一个数组(废话),他的作用是存储字典序排名为i的后缀的位置(即后缀的起点) 而后缀数组常常与rank数组同步计算,其中rank数组是起点为i的后缀的排名 既然如此,我们
阅读全文
摘要:一道好题,利用kmp维护递推再更新矩阵乘法 这题首先可以递推: 设状态f[i][j]表示长串更新到了i位置,已经匹配短串匹配了j个数 那么我们有转移: f[i][get_nxt(j)]+=f[i-1][j-1] 当然,你并不懂这是什么意思 我们挨个解释一下 主题思想就是在前面放好的j-1个字符的基础
阅读全文
摘要:AC自动机是一个多模字符串匹配的自动机(网上说的),主要作用是在一个长串中同时进行多个字符串的匹配 基础芝士: trie树(字典树) 烤馍片kmp单模字符串匹配 如果不会的建议去网上学一下(本篇讲解略过) 这里重点讲一讲AC自动机 (由于本蒟蒻不会指针,所以所有算法一律不使用指针,请神犇们谅解) 例
阅读全文
摘要:manacher是很简单的字符串回文算法,作用是O(n)求出一个字符串的最长回文子串 下面给出这一算法的详解 首先,我们设原字符串是aaabba,很显然,这个字符串最长的回文子串长度为4 那么我们就要思考一种算法来计算出这个长度 于是manacher横空出世 首先,我们知道,一个回文子串一定有一个对
阅读全文