后缀自动机
文章平均质量分 92
alpc_qleonardo
这个作者很懒,什么都没留下…
展开
-
BZOJ 3998 弦论(后缀自动机+dfs)
相对来说比较简单的一道题目。 求排名第k大的子串。显然,既然是所有子串,那么显然用后缀自动机,这个可以在里面保存所有子串的东西。然后就是考虑第k大。我们知道自动机里面的每一个节点表示一个状态,它的最大长度对应一个子串。然后所有的parent指针指向它的状态都是包含它的。所以说,如果那些状态出现,这个状态一定会出现,因此可以对于T不同的情况讨论。如果T等于0,那么只要它在parent树中有儿子或者本事就是关键点,那么该点表示的串出现次数为1;如果T等于1,那么该点表示串出现次数为本身的值与儿子出现原创 2018-03-24 08:55:13 · 343 阅读 · 0 评论 -
2019HDU多校赛 第十场 HDU 6694 Play Games with Rounddog(后缀自动机 + 线性基)
大致题意:给你一个字符串S,然后q个询问,每次给出S的一个子串T。对于每个询问的子串T,Calabash可以在S中选择任意个以T作为后缀的子串,然后生成子串对应数目个石子堆,每堆的石子数量等于w[对应子串在S中出现的次数]。然后Rounddog可以从这么多堆石子中选择任意堆的石子(至少选一堆),两人开始玩Nim游戏,Calabash先手。现在问Calabash是否存在必胜策...原创 2019-08-23 10:15:25 · 591 阅读 · 0 评论 -
HDU 5470 Typewriter(后缀自动机 + 单调队列优化dp)
大致题意:给你一串字符以及单独打印每一个字母的代价,对于一个字母,你可以选择直接打印,也可以选择利用复制粘贴的方法来完成。对于复制粘贴,每次选择长度为i的字符串的代价是i*A,复制的代价是B,粘贴的代价也是B。即复制并粘贴一个长度为x的字符串的代价是x*A+2*B。现在问把这一整个字符串打印出来的代价是多少。这道题目在今年三月的时候就开始做了,但是当时一直WrongAnswer没有找到原因,然后最近复习字符串重新做了一下,才终于过了。首先,我们考虑暴力的做法。我令dp[i]表示打印到第i个字符的最小代价,那原创 2018-08-17 16:37:23 · 556 阅读 · 2 评论 -
BZOJ 4199 [Noi2015]品酒大会(后缀自动机 + parent树上统计)
大致题意:给你N杯酒,每杯酒上有一个字符和一个对应的美味。定义两杯酒r相似,是指从两杯酒的编号i和j出发,的长度为r的字符串相同。现在让你输出r取0~n-1时的r相似串的对数,并且输出r的每个取值对应的乘积最大的两杯r相似酒。具体来说就是计算每个长度下,有多少对位置不同的相同子串出现过。那么对应就需要知道一个字符串的所有子串,因此显然还是要用到后缀自动机了。考虑到本题还需要求一个最大的乘积,而这个乘积的数值取决于字符串的开始位置,所以我们不妨在把字符串添加入自动机的时候反过来添加。添加完毕之后,我们首先考虑原创 2018-08-16 16:58:27 · 456 阅读 · 0 评论 -
HDU 6405 2018HDU多校赛 第八场 Make ZYB Happy(广义后缀自动机)
大致题意:给你n个字符串,然后每个字符串有一个快乐值。然后给你m个询问,每个询问给你一个长度,让你写出一个不大于这个长度的字串。这个字串的权值定义为,如果这个字符串中出现过第i个给定字符串的子串,那么权值乘以第i个字符串的快乐值,最后答案就是多个快乐值相乘。现在问你给定长度的字符串权值的期望。首先,我们考虑这个权值的分母是多少。显然长度不超过x,那就是说长度可以是1、2、...、x,对应26个字母,那么方案数就是。然后我们再来看分母。分母肯定是计算每一个长度的贡献,对于一个长度,他可以是很多个串的子串,所以原创 2018-08-15 22:48:53 · 654 阅读 · 2 评论 -
BZOJ 2555 Substring(后缀自动机+LCT子树维护)
查找一个字符串在另一个字符串中的出现次数,这是一个很简单的问题。用很多的数据结构的可以解决。但是如果遇到动态的问题就不是那么好解决了。本题要求支持强制在线的增加与查询,纵观字符串的数据结构,只能是后缀自动机了。 后缀自动机本身加入字符的时候是一个个加入的,在加入的同时本身动态的可以维护parent和len等数据。对于后缀自动机来说,求一个字符串在原串中出现次数,还是和parent树的性质有关。根据parent指针的含义,parent表示的状态是当前状态的后缀,反过来当前状态的串就是paren原创 2018-03-23 08:58:39 · 454 阅读 · 0 评论 -
HDU 5853 Jong Hyok and String(二分+后缀数组/广义后缀自动机)
大致题意,给你很多个串,然后给你很多个询问,每个询问对应给出一个子串,问有多少个子串在之前给的串中的出现位置与这个的出现位置完全相同。 对于这道题目,考虑出现位置相同,也即出现次数相同。如果我们考虑用后缀数组,那么显然,求出SA数组之后,如果某个子串被包含询问串或者被包含(询问串是该串的后缀或者该串是询问串的后缀),而且出现次数与询问出现次数相同,则这个子串一定是满足条件的串。那么问题的关键就是如何求这些串的次数 由于询问串是所求串的后缀,为了利用后缀数组的性质,我们干脆把这原创 2018-03-26 23:58:19 · 364 阅读 · 0 评论 -
CSU 2037 Mars(后缀自动机+DFS)
大致题意,给你一个01字符串,然后再给你这个字符串的一个子串,问你在子串中至少修改多少个字符,才能够使得修改之后的串在原串中不出现。 现场拿到题就知道一定是SAM后缀自动机。因为要求是某一个串在原串中不出现,也就是某个串不是原串的子串,所以我们显然要知道做到判定串是否是子串。纵观比较高效的数据结构,也就只有后缀自动机了。我们首先对原串建立自动机,然后利用是01串的性质,对照给出串的每一位,分别dfs每一位是与原来相同,还是不同,相同不需要代价,不相同则需要代价。枚举了下一位的数字就可以顺着自动原创 2018-04-08 20:38:18 · 466 阅读 · 0 评论 -
BZOJ 3238 差异(后缀自动机+树上统计)
中文题,题意自己看看吧。 看到表达式,难求的主要是lcp,任意两个后缀的lcp。即使用上后缀数组求这么多个lcp也是要超时的。但是这里如果用后缀自动机的性质,会好很多。 我们之前在介绍后缀自动机的时候说过,parent树表示父亲是儿子最长的一个后缀。那么,对于最长公共后缀的时候,两个字符串对应状态的LCA的len值,就是我们最长公共后缀的长度。即两个字符串往上走,都是走到他们的后缀,然后越往上长度越短,所以说第一个相同后缀一定是最长的,对应长度就是LCA的len。对于本题的原创 2018-03-22 08:46:05 · 331 阅读 · 0 评论 -
后缀自动机初探(模板)+ SPOJ LCS2
据说后缀自动机这个东西,要先学后缀数组还有后缀树,再学后缀自动机。但是我只学了后缀数组,然后就直接学这个,难免可能有些理解不到位。硬刚了两天吧,才算是有一点小的理解。 首先呢,最初的源头还是CLJ大佬的的那个ppt,但是说实话,可能因为是本人太渣,有些地方看不懂,或者说证明太多了不想看。论文看了个大致没有深究,也用自己的想法强行理解,可能有些不对,以后再慢慢研究。 ...原创 2018-03-21 20:49:05 · 363 阅读 · 2 评论 -
HDU 5343 MZL's Circle Zhou(后缀自动机+记忆化搜索)
大致题意,给你两个字符串,然后从第一个字符串里面取出一个子串X,从第二个字符串里面取出一个子串Y,两个拼接在一起组成新的字符串,其中X、Y都可以是空串,问有多少个这样不同的串。 如果整体来思考不同的X+Y的个数,会发现找不到突破口。我们可以考虑X+Y为什么会有重复的。举个例子ababc,可以由ab+abc或则a+babc组成。重复的原因在于在第一个串中可以找到ab,也可以找到a,而如果a可以构成这个拼接串,那么ab也构成这个拼接串。所以说,为了避免重复,我们可以在第一个串中找最长的点,即原创 2018-03-25 17:08:13 · 338 阅读 · 0 评论 -
计蒜客 2019ICPC 南昌网络赛 F Megumi With String(后缀自动机)
大致题意:给你一个字符串S和一个多项式f(x),然后再告诉你一个长度。随机取这样一个长度的字符串T,如果T包含S的某个子串且这个子串的长度为len,那么T的权值就增加f(len),如果包含多个子串,那么权值为他们的和。现在问你这个T的期望权值是多少,且S不断变长,你需要求T在每个S情况下的期望。这题可以参照 HDU 6405 两题有类似之处。这里本质上相当于统计每个...原创 2019-09-14 09:39:48 · 270 阅读 · 1 评论