字符串
litble
Away From OI已久,一天天变菜中,博客平时不咋看,也没能力答疑和改错了,因此不会互动见谅orz
展开
-
trie树
1.什么是trie?trie树,又名前缀树。用来保存字符串集合。如图所示。(图是网上找的)图中就是一个trie,树,每个节点都是一个字母,当我们深入到一个单词结束位置的时候,我们就获得了一个单词。例如我们从根节点出发,走到“t"再走到”e",再走到“a",就获得了单词"tea"。2.trie树有什么用?如果你要找一些单词的公共前缀之类的,反正是和前缀有关的问题都很好用,比普通的原创 2017-03-21 20:30:45 · 411 阅读 · 3 评论 -
洛谷P4585/bzoj4137 火星商店问题 线段树+可持久化trie树
题目分析首先特殊商品显然可持久化trie树一波就行了。至于非特殊商品呢?时间线段树套可持久化trie?注意到本题没有要求强制在线,所以并不需要套呗。把询问都落到时间线段树的区间上(用vector存),然后将所有添加商品事件都按照商店编号排序。递归遍历时间线段树,遍历到一个区间(线段树的一个节点)时,将这个区间的所有添加商品事件建立可持久化trie树。然后处理这个节点上的所有询问。代码...原创 2018-12-14 08:26:24 · 572 阅读 · 0 评论 -
bzoj1559/洛谷P4045 [JSOI2009]密码 AC自动机+状压DP+搜索
我差点没死在这道题上…首先建出AC自动机,然后在每一个字符串的末尾节点用二进制状态记录该字符串已经完整地出现过了,然后设f(i,x,zt)f(i,x,zt)f(i,x,zt)表示长度为iii的密码,对应AC自动机上的xxx节点,当前每个串有没有出现的状态为ztztzt的方案数即可DP。由于最终结果小于2632^{63}263,所以我们可以DP的过程中对2642^{64}264取模也就是用uns...原创 2018-10-25 16:00:32 · 262 阅读 · 0 评论 -
bzoj4134 ljw和lzr的hack比赛 trie树合并
题目分析首先,我们删掉所有被Hack的点,剩下的点的父亲,为原树上它的第一个没有被Hack的祖先。则产生了一个森林。那么对于这个游戏局面,sg值为每棵树的sg值的异或和。现在考虑一棵树的sg怎么算。记g(x)g(x)g(x)为在这棵树中选一个节点xxx,将xxx与其祖先全部删除,剩下的子树们的sg异或和。那么该树中所有g(x)g(x)g(x)的mex就是该树的sg。我们发现,假设我们现在在...原创 2018-09-29 20:55:51 · 293 阅读 · 0 评论 -
codeforces 700E 后缀自动机+线段树合并
每次只算s[i-1]是s[i]的后缀的情况,显然是不会影响答案的。因为如果s[i-1]不是s[i]的后缀,那么我们把不与s[i-1]匹配的那后面一截都去掉,s[i]就会变短。如果没变短之前它在某一个字符串里出现过了,那么变短后显然还是出现过的。于是想到后缀自动机,建立后缀自动机。既然有“出现两次”这个条件,那么显然与每个节点的right集合(或者说end-pos集合?)有关。想到一个dp:...原创 2018-07-24 10:06:28 · 610 阅读 · 0 评论 -
[HN省队集训Day2]有趣的字符串题 回文树+线段树+树状数组
题目描述白兔有一个长度为n的字符串。 白云有m个询问,每个询问会询问一段区间的本质不同回文子串个数。 (虽然原题没说,但是字符串只包含小写字母)输入描述第一行两个整数n, m。 接下来一行一个长度为n的字符串。 接下来m行,每行两个整数l, r。输出描述为了避免输出占用太多运行时间,你只需要输出∑mi=1ansi∗imod109+7∑i=1mansi∗imod109+7...原创 2018-06-21 20:16:28 · 1482 阅读 · 3 评论 -
哦也!伟大的回文树(回文自动机)!
例题引入例题引入:洛谷P3649 话说马上就要APIO了,litble去看了看历年的APIO题……发现这道题用回文树非常好做,所以就去学了一下回文树。 所谓回文树,就是每个节点代表一个不同的回文串的一种数据结构。 它也有可以类比于AC自动机的fail指针,表示失配了之后去寻找哪个节点。 此外,每个节点上还要记录 len:该节点代表的回文串长度 cnt:该节点代表的回文串在原串中出现...原创 2018-04-28 13:48:14 · 1775 阅读 · 2 评论 -
后缀三兄弟之三——后缀自动机(附广义后缀自动机,子序列自动机)
什么是后缀自动机温馨提醒:以下概念比较晕人,请保持耐心. 后缀自动机是一个有向无环图,节点为状态,有向边为状态转移。其中有一个初始状态可以到达所有状态,若干个结束状态,从初始状态走到一个结束状态,就是原本字符串的一个后缀。 可接受节点:若p是一个可接受节点,那么从root到p的每条路径上的字符组成的字符串,都是当前串的一个后缀。因此,在加入一个新字符时,这个节点后面可以连一个新节...原创 2018-01-07 21:40:56 · 3752 阅读 · 1 评论 -
图解扩展kmp--by boshi
转自http://www.k-xzy.xyz/,作者boshi图解扩展kmp #include <iostream>#include <cstdio>#include <cstring>#define MX 1000using namespace std;int next转载 2017-05-18 19:08:03 · 423 阅读 · 0 评论 -
poj2758/bzoj2258 文本校对 后缀数组+RMQ
题目大意对于一个字符串进行以下两个操作: I:插入一个字符到现在字符串中一个字符的前面。该操作不超过2000个 Q:询问原来的字符串中以第a个字符和第b个字符开始的最长公共前缀题目分析维护三个数组:posipos_i:原串中第i个字符现在所处的位置,opsiops_i:现在串中第i个字符原来所处的位置(如果是插入进来的字符,则opsi=−1ops_i=-1),disidis_i原创 2018-01-07 13:35:21 · 543 阅读 · 0 评论 -
后缀三兄弟之二——后缀数组
什么是后缀数组?假设我们现在有一个字符串”ababa” 我们知道这个数组有一些后缀,分别是(以下后缀i指以i为开头的后缀) 1 2 3 4 5 ababa baba aba ba a现在我们按照字典序将它们排序,得到:5 3 1 4 2,那么我们令SA1=5,SA2=3,SA3=1...SA_1=5,SA_2=3,SA_3=1.原创 2018-01-06 15:48:53 · 735 阅读 · 0 评论 -
扩展kmp(HDU4333)
1.思路对于一个数413413,可以生成多少个数呢?不难注意到,因为它有两个循环节,所以生成的数每个都重复了两遍,循环节个数可以通过kmp快速求出,最后求出的答案都除以一个循环节个数即可,在此不再赘述,见我的另一篇博客:http://k-xzy.cf/?p=1165剩下的内容就是求这个数重复两遍得到的新数(比如63就是得到6363)的每一个后缀与原数的公共前缀,这样只要分别比较公共前缀原创 2017-04-23 19:58:43 · 902 阅读 · 0 评论 -
阿狸的打字机(bzoj2434,codevs1946,洛谷2414)
1.分析朴素的算法是把所有字符串处理出来后对于每个询问进行一次kmp,然并卵,肯定超时。因为有很多字符串,我们可以考虑建立一个AC自动机。这样我们又有了一种思路,假如顺着某个节点的fail指针走,最后可以走到某个字符串的末尾,那么表示这个节点所在的字符串里包括一个那个能走到末尾的字符串。不信看图:可是这样子搞还是太慢了。我们可以根据反向的fail指针建立一棵fail树,这样的话原创 2017-04-20 18:50:06 · 497 阅读 · 0 评论 -
AC自动机与dp(poj3691)
1.题目大意给你一段DNA,求最少修改多少基因可以让DNA不含带病基因(基因只能是G,T,C,A)2.做法简述AC自动机+dp,用f[i][j]表示在i节点处匹配DNA中j处基因的最少修改次数,那么方程是:f[son[i]][j]=min(f[son[i]][j],f[i][j-1] or f[i][j-1]+1);如果son[i]处基因和DNAj处相同则不要加1,否则要加1原创 2017-04-18 13:33:15 · 748 阅读 · 0 评论 -
AC自动机
1.参考资料: http://blog.csdn.net/mobius_strip/article/details/22549517 http://www.cppblog.com/mythit/archive/2009/04/21/80633.html http://blog.csdn.net/niushuai666/article/details/70028232.什么是原创 2017-03-24 18:49:34 · 456 阅读 · 0 评论 -
KMP算法
1.什么是KMP?这是一种字符串匹配的方法,用于检验一个字符串是不是另一个字符串的子串,是的话在哪个位置。比如说”orz“是”orzjyf"的子串。一般的检验子串的方式就是对于“orzjyf"中的每一个字符位置都进行一次比较,由于通常不需要比较到最后一位,似乎也不是很复杂,但是如果你遇见了一些极其BT的出题人,他就偏偏要你比较到最后一位,比如”oooooooooooooorz"和“oooo原创 2017-03-23 19:43:11 · 374 阅读 · 1 评论 -
codeforces1063F String Journey SAM+DP+dfs序+线段树
题目分析实际上,分出来的所有ttt的长度应该是连续的,因为如果不连续的话,删掉过长的ttt首尾几个字符即可。于是可知,ti+1t_{i+1}ti+1应该是tit_iti删掉首字母或者尾字母形成的字符串。将原串反过来,前缀就变成了后缀。设dp(i)dp(i)dp(i)表示以字符iii结尾划分为最后一个字符串,可以划分的最大长度。由于以iii结尾的字符串和以i−1i-1i−1结尾的字符串,...原创 2019-03-15 08:07:53 · 394 阅读 · 0 评论