![](https://img-blog.csdnimg.cn/20210728183440604.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
字符串相关——自动机&&kmp
文章平均质量分 82
无
迷蒙之雨
这个作者很懒,什么都没留下…
展开
-
⌈·M·e·r·c·u·r·y·⌋ AC自动机·杂题选做
多串匹配,考虑ACACAC自动机。因为2t2^t2t个串是独立的,所以算出一个的概率乘上2t2^t2t就好了。设dp[i][j]dp[i][j]dp[i][j]表示前iii个位置,走到ACACAC自动机上jjj这个节点,模式串的出现次数是奇数的概率,设f[i][j]f[i][j]f[i][j]为总概率。设cnt[i]cnt[i]cnt[i]为模数串在iii节点代表的节点中出现次数的奇偶性,那么转移时枚举这一位是什么字符,乘上对应的概率。并且因为要求是奇数,所以转移完要看看如果某个节点的cntcntcnt为1原创 2022-09-25 19:11:13 · 575 阅读 · 0 评论 -
[CTSC2010]珠宝商(点分治+根号分治+后缀自动机)
[CTSC2010]珠宝商 洛谷题目传送门 简要题意 给定一颗nnn个节点的树,和一个长度为mmm的模式串SSS 树上每个节点都有一个字符 求树上所有路径的点的字符拼成的字符串在SSS中的出现次数之和 解题思路 路径统计?一听就很点分治 字串出现次数?一听就很SAM 那这个题实际也就是这两个的结合了 I 首先有一个显然的O(n2)O(n^2)O(n2)做法 建出SAMSAMSAM 并求出每个节点代表的字串在SSS中出现的次数,即为siz[x]siz[x]siz[x] 那么我们直接枚举路径起点,然后跑dfsd原创 2022-02-19 13:47:48 · 296 阅读 · 0 评论 -
字符串刷题杂记
AC自动机 CF710F String Set Queries 洛谷题目传送门 询问出现次数是AC自动机的拿手好戏,一个节点的出现次数是这个节点在失陪树上到根节点的路径上的出现次数总和 但是AC自动机这种东西不支持凭空添加一个字符串 如果可以离线就可以用CDQ分治搞定 但是强制在线就有点困难 有一个可以解决强制在线问题的分治算法,就是二进制分组 我们分别维护大小为1,2,4,8,16……1,2,4,8,16……1,2,4,8,16……的ACACAC自动机 加入一个串的时候,我们就先将它和大小为1的合并,重构原创 2022-02-17 16:24:43 · 199 阅读 · 0 评论 -
codeforces Forensic Examination(SAM+线段树合并)
洛谷题目传送门 我们先对S和所有的询问串共同建立一个广义SAM 并且在每个节点上维护一颗线段树代表这个节点代表的字串在各个串中出现次数 也就是题目要求的,那么这个显然可以线段树合并维护出来 然后询问的时候,我们要先在SAM上定位这个区间的字串,这个也很简单:每个子串可以看成一个前缀的后缀,而我们知道跳parent边就是不断取后缀的过程,所以我们先找到这个区间的前缀在SAM上的节点,然后跳parent边一直到合法,这个过程可以用书树上倍增加速 然后我们在这个节点对应的线段树上查询题目给的区间内出现次数最多的串原创 2022-01-22 15:35:03 · 477 阅读 · 0 评论 -
[FJOI2015]火星商店问题(线段树分治+可持久化01Trie)
洛谷题目传送门 解题思路 看到区间异或最大值,我们可以想到可持久化Trie树 而看到动态的加入和删除,我们想到线段树分治 因此把这两个结合起来就行了 这个题和一般的线段树分治不太一样的的是,并不是物品有时间范围,而是查询有时间范围,我们知道最值问题是有可重叠性的,因此可以把每个询问的区间插入到时间线段树中,查询的时候 我们可以先对物品按照商店编号排序,保证建立可持久化Trie树的时候更容易 假设我们在线段树上遍历了某个区间,就把这个区间内的所有物品一起构建一颗可持久化0/1Trie,然后因为没有时间的限制,原创 2021-12-10 13:33:45 · 576 阅读 · 0 评论 -
字符串算法总结
(一) 后缀数组(SA) 后缀数组是处理字符串的一大利器,常用倍增算法构造,一般情况下用到Height数组更常见 重要性质 1:两个后缀的最长公共前缀(记为lcp)为两个后缀在排名数组中两点间的Height值得最小值,常配合ST表或单调栈处理 2:将后缀按照字典序排序后,第iii个后缀能贡献的本质不同子串个数为leni−Heightilen_i-Height_ileni−Heighti,且这些子串是按照字典序排序的 因此可以得到一个字符串的本质不同子串个数为∑i=1nleni−Heighti\sum_{原创 2021-11-29 21:46:49 · 900 阅读 · 0 评论 -
哈希表【散列表】详解
哈希表【hash】 hash表是一种数据结构,又称为散列表,其根本的原理就是把一个数变成另外一个易于存储的数。 先来看一道例题吧 假如有n个数,n的范围只有10万,但是每个数的大小有1e9,怎么做才能统计每个数出现的次数呢? 如果每个数的范围很小,则可以开一个数组(俗称为“桶”)存储。 但是 现在,根本开不了1e9的数组。而且,总共就1e5个数字,如果开1e9的数组,那么至少会浪费500000000个位置,就太不值得了。 事实上,根本没必要开那么大,只要能存1e5个数字就可以了。 于是我们就要原创 2021-05-05 19:53:21 · 542 阅读 · 0 评论 -
KMP算法详解
(转载)详解KMP算法 KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白。这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法。 ...转载 2018-11-01 08:37:41 · 149 阅读 · 0 评论 -
kmp刷题记录
kmp刷题记录 题目描述 给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。 A 中不同位置出现的 B 可重叠,详见样例二、四。 输入格式 输入共两行,分别是字符串 A 和字符串 B。 输出格式 输出一个整数,表示 B 在 A 中的出现次数。 样例数据 input RachelAhhhh h output 5 input RachelAhhhh hh output 3 input RachelAhhhh hhh output 2 ...原创 2021-02-16 14:00:08 · 414 阅读 · 0 评论 -
KMP算法(转载)
首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几个?为了方便叙述,我们先给定两个字符串的值 A="abcaabababaa" B="abab" 那么普通的匹配是怎么操作的呢? 当然就是一位一位地比啦。(下面用蓝色表示已经匹配,黑色表示匹配失败) 但是我们发现这样匹配很浪费! 为什么这么说呢,我们看到第4步: 在第4步的时候,我们发现第3位上c与a不匹配,然后第五步的时候我们把...转载 2019-02-13 10:26:14 · 364 阅读 · 0 评论 -
好题推荐(KMP+DFS序+CDQ分治/主席树)
题目描述 给一个字符串SSS,有QQQ次询问,每次询问给两个数x,yx,yx,y,求SSS的前缀S[1−>x]S[1->x]S[1−>x]和SSS的后缀S[(n−y+1)−>n]S[(n-y+1)->n]S[(n−y+1)−>n]这两个字符串串联后得到的新串T=S[1−x]+S[(n−y+1)−>n]T=S[1-x]+S[(n-y+1)->n]T=S[1−x]+S[(n−y+1)−>n],在SSS中出现了多少次。 考试思路 昨天lsj大原创 2021-10-03 22:20:03 · 108 阅读 · 0 评论 -
[FJOI2016]所有公共子序列问题(DP+序列自动机+高精度)
洛谷题目传送门 题目大意: 求两个字符串的公共子序列个数 解题思路 知识点: 序列自动机(Sequential automata) 据wjn大佬说,这是你学过的最简单的自动机算法 不得不说,这个自动机确实不难,不过相关它的题可是把人写懵了 它的核心就是一个Next数组 Next[x][c]表示在当前字符串的第x位置往后的第一个字符c的位置 构造思路就是从后往前构造 void build(int p) { for(int i=n-1;i>=0;i--) { for(int c=0;c<=5原创 2021-07-28 17:00:31 · 111 阅读 · 0 评论