后缀自动机
小蒟蒻yyb
Studnet
展开
-
【SPOJ】Distinct Substrings(后缀自动机)
题面Vjudge 题意:求一个串的不同子串的数量题解对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是right/endposright/endpos集合的大小 但是实际上我们没有任何必要减去不合法的数量 我们只需要累加每个节点表示的合法子串的数量即可 这个值等于longest−shortest+1=longest−parent.longestlongest-shortest+1=原创 2018-02-13 11:33:10 · 228 阅读 · 0 评论 -
【BZOJ3926】诸神眷顾的幻想乡(后缀自动机)
题面BZOJ题解广义后缀自动机啦 求多个串的不同子串个数? 当然是后缀自动机,最后只要把longest−parent.longestlongest-parent.longest求个和就好啦 那么这题怎么建后缀自动机 能够把所有子串都丢进去呢? 当然不用从每一个节点开始 把树建出来之后,从每个叶子节点开始遍历一遍, 同时把遍历到的点查进SAMSAM就行了 因为每个点的儿子数量最多只有2原创 2018-02-21 19:53:59 · 213 阅读 · 0 评论 -
【BZOJ2882】工艺(后缀自动机)
题面BZOJ权限题,良心洛谷题解还是一样的,先把串在后面接一遍 然后构建SAMSAM 直接按照字典序输出nn次就行了#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<set>#include<map>#incl原创 2018-02-21 20:21:39 · 250 阅读 · 0 评论 -
【BZOJ4199】品酒大会(后缀自动机)
题面BZOJ题解发现了一个很有趣的东西 后缀排序之后对heightheight排序,用并查集维护 和在后缀树上dpdp是一样的 所以这题用后缀树来dpdp 将串反着插入SAMSAM 构建后缀树 对于每个点维护最大值,最小值,和子树大小 每次只会更新u.longestu.longest位置的值 然后前缀和一下就是答案#include<iostream>#include<cstdio>原创 2018-02-23 22:13:44 · 274 阅读 · 0 评论 -
【CF235C】Cyclical Quest(后缀自动机)
题面洛谷题解大致翻译: 给定一个串 然后若干组询问 每次也给定一个串 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其旋转的串在给定的串中出现了多少次显然,串可以旋转,那么考虑在后面再接一份就行了匹配的话就是后缀自动机的匹配 但是额外的注意一点 如果当前匹配出来的最大长度>=len>=len 也就是当前串的长度 那么就要跳父亲因为旋转后可能有相同的串出现 所以要开原创 2018-02-24 21:11:28 · 273 阅读 · 0 评论 -
【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)
题面BZOJ 洛谷题解很有趣的一道题啊对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机然后这个拆分很像一个dpdp 同时,要求的东西很像一个可以二分的样子所以二分一个答案,考虑如何dpdp 设f[i]f[i]表示处理完前ii个字符,能够匹配上的最多的字符个数 转移是f[i]=max(f[j]+i−j)f[i]=max(f[j]+i-j),满足i−j>midi-原创 2018-03-13 20:22:57 · 274 阅读 · 0 评论 -
【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)
题面自从有了DBZOJ 终于有地方交权限题了题解很明显,只出现了一次的串 在SAMSAM的right/endposright/endpos集合大小一定为11 换句话说,在parentparent树上是叶子节点 找到所有这样的节点, 假设它的len=rlen=r,它父亲的len=plen=p,它的结束位置为显然就是rr 令l=r−pl=r-p 以rr结尾, 并且只出现了一次的串的左端点原创 2018-04-02 17:07:57 · 278 阅读 · 0 评论 -
【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)
题面BZOJ 洛谷题解裸的广义后缀自动机??? 建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括了 然后读入串直接匹配就好了#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<set>#include<原创 2018-04-02 19:03:55 · 160 阅读 · 0 评论 -
【CF666E】Forensic Examination(后缀自动机,线段树合并)
题面洛谷 CF翻译: 给定一个串SS和若干个串TiT_i 每次询问S[pl..pr]S[pl..pr]在Tl..TrT_l..T_r中出现的最多次数,以及出现次数最多的那个串的编号。题解好题啊。我们对于所有的TT串构建出广义后缀自动机之后 把SS丢到SAMSAM上匹配,对于每组询问, 相当于回答S[pl..pr]S[pl..pr]所代表的节点的rightright集合所代表的串的众数是哪个原创 2018-04-12 09:15:41 · 213 阅读 · 0 评论 -
【BZOJ5137】Standing Out from the Herd(后缀自动机)
题面BZOJ 洛谷题解构建广义后缀自动机 然后对于每个节点处理一下它的集合就好了 不知道为什么,我如果按照拓扑序从下往上合并是错的 但是把parentparentparent树建出来再合并就对了。。#include<iostream>#include<cstdio>#include<cstdlib>#include<c...原创 2018-05-28 15:24:08 · 324 阅读 · 0 评论 -
【BZOJ3277】串(后缀自动机)
题面BZOJ题解广义后缀自动机??? 照着别人的打了一遍。。 相当于每个串都构建一个后缀自动机 构建完一个串之后,直接把当前的last指回root就行了??? 好吧,我觉得我看了一个假的广义后缀自动机。。不过这道题这样就行了 考虑如何计算一个串在多少个母串中出现过? 考虑他的rightright集合中有多少个母串的结束位置就好了 那么,每个节点开个setset存一下,然后按照拓扑序向上原创 2018-02-21 17:24:28 · 343 阅读 · 0 评论 -
【BZOJ4516】生成魔咒(后缀自动机)
题面BZOJDescription魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。 例如 S=[1,2,1] 时,它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五种。S=[1,1,1] 时,它的生成魔咒有 [1]、 [1,1]、[1,1,1] 三原创 2018-03-14 22:12:18 · 205 阅读 · 0 评论 -
【Luogu3804】【模板】后缀自动机(后缀自动机)
题面洛谷题解一个串的出现次数等于right/endposright/endpos集合的大小 而这个集合的大小等于所有parentparent树上儿子的大小 这样子的话,给每个终止位置的sizesize记为11 然后按照拓扑序累加,这就是right/endposright/endpos集合的大小 最后对于每个size>1size>1的节点,ans=max(longest∗size)ans=ma原创 2018-02-13 11:36:57 · 314 阅读 · 0 评论 -
【SPOJ】Longest Common Substring(后缀自动机)
题面Vjudge 题意:求两个串的最长公共子串题解SASA的做法很简单 不再赘述对于一个串构建SAMSAM 另外一个串在SAMSAM上不断匹配 最后计算答案就好了 匹配方法: 如果trans(s,c)trans(s,c)存在 直接沿着transtrans走就行,同时cnt++cnt++ 否则沿着parentparent往上跳 如果存在trans(now,c),cnt=now.lon原创 2018-02-13 11:42:42 · 259 阅读 · 0 评论 -
【SPOJ】Longest Common Substring II (后缀自动机)
题面Vjudge 题意:求若干个串的最长公共子串题解对于某一个串构建SAMSAM 每个串依次进行匹配 同时记录f[i]f[i]表示走到了ii节点 能够匹配上的最长公共子串的长度 当然,每个串的f[i]f[i]可以更新f[i.parent]f[i.parent] 所以需要拓扑排序对于每个串求出每个节点的最长匹配 然后对他们取minmin,表示某个节点大家都能匹配的最长长度 最后对于所有原创 2018-02-13 11:49:43 · 495 阅读 · 0 评论 -
【SPOJ】Substrings(后缀自动机)
题面Vjudge 题意:给定一个长度为lenlen的串,求出长度为1~len的子串中,出现最多的出现了多少次题解出现次数很好处理,就是right/endposright/endpos集合的大小 那么,直接构建SAMSAM 求出每个位置的rightright集合大小 直接更新每个节点的longestlongest就行了 最后短的可以由长的更新过来就好#include<iostream>#i原创 2018-02-13 11:58:45 · 321 阅读 · 0 评论 -
【HDU4622】Reincarnation(后缀自动机)
题面Vjudge 题意:给定一个串,每次询问l~r组成的子串的不同子串个数题解看到字符串的大小很小 而询问数太多 所以我们预处理任意的答案枚举左端点,依次向右加入新节点 直接统计答案即可#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorit原创 2018-02-13 12:49:38 · 290 阅读 · 0 评论 -
【BZOJ2555】SubString(后缀自动机,Link-Cut Tree)
题面BZOJ题解这题看起来不难 每次要求的就是right/endposright/endpos集合的大小 所以搞一个LCTLCT维护一下SAMSAM的ParentParent树就好了 但是代码一点都不好写(我还是对着黄学长的调的。。。) 于是乎我也学着魔改了一下LCTLCT#include<iostream>#include<cstdio>#include<cstdlib>#inclu原创 2018-02-14 17:12:35 · 207 阅读 · 0 评论 -
【BZOJ4566】找相同字符(后缀自动机)
题面BZOJ题解原创 2018-02-15 11:28:00 · 252 阅读 · 0 评论 -
【BZOJ3998】弦论(后缀自动机)
题面BZOJ题解这题应该很简单 构建出SAMSAM后 求出每个点往后还能构建出几个串 按照拓扑序dpdp一些就好了 然后就是第kk大,随便搞一下就好#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<set>#原创 2018-02-15 20:11:43 · 206 阅读 · 0 评论 -
【BZOJ3238】差异(后缀自动机)
题面BZOJ题解前面的东西直接暴力算就行了 其实没必要算的正正好 为了方便的后面的计算 我们不考虑i,ji,j的顺序问题 也就是先求出∑ni=1∑nj=1[i≠j]len[i]\sum_{i=1}^n\sum_{j=1}^n[i\neq j]len[i] 然后对于每个后缀树上的节点,减去一下贡献 也就是size[i]∗(size[i]−1)∗(len[i]−len[i.parent])s原创 2018-02-16 10:59:31 · 245 阅读 · 0 评论 -
【CF700E】Cool Slogans(后缀自动机)
题面洛谷 CodeForces题解构建后缀自动机,求出后缀树 现在有个比较明显的dpdpdp 设f[i]f[i]f[i]表示从上而下到达当前点能够满足条件的最优值 只需要检查父亲节点是否在当前串中出现过两次就行了 这个判断用endposendposendpos来判断 如果出现过超过两次,那么在当前点所掌控的任意一个endposendposendpos以及前面的区间中 ...原创 2018-05-31 16:37:28 · 240 阅读 · 0 评论