随笔分类 -  字符串算法 -- 后缀自动机

摘要:【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机) 题面 "洛谷" BZOJ权限题 题解 如果要我们做暴力,显然可以以某个点为根节点,然后把子树$dfs$一遍,建出特征串的$SAM$,就可以直接计算出现次数了。复杂度是$O(size^2)$ 另外一种暴力是我们枚举以某个点为中心,考 阅读全文
posted @ 2019-07-08 14:37 小蒟蒻yyb 阅读(621) 评论(0) 推荐(0) 编辑
摘要:【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机) 题面 "BZOJ" "洛谷" 题解 数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行$bfs$,找到的第一个不同时存在的节点就直接输出就好了。 cpp include include inc 阅读全文
posted @ 2019-04-28 20:00 小蒟蒻yyb 阅读(302) 评论(0) 推荐(0) 编辑
摘要:【BZOJ5496】[十二省联考2019]字符串问题(后缀树) 题面 "BZOJ" "洛谷" 题解 首先显然可以把具有支配关系的串从$A$到$B$连一条有向边,如果$B_i$是$A_j$的前缀,就从$B$连一条边到$A$。这样子问题就转化成了要求解这个二分图的最长路经,有环答案就是$ 1$。 然后显 阅读全文
posted @ 2019-04-12 22:39 小蒟蒻yyb 阅读(492) 评论(0) 推荐(0) 编辑
摘要:【BZOJ5417】[NOI2018]你的名字(线段树,后缀自动机) 题面 "BZOJ" "洛谷" 题解 首先考虑$l=1,r=|S|$的做法,对于每次询问的$T$串,暴力在$S$串的$SAM$上跑,对于每个点记录其被匹配的最大长度,然后把每个被匹配到的点以及它到$parent$树根节点的所有节点全 阅读全文
posted @ 2019-04-03 09:42 小蒟蒻yyb 阅读(679) 评论(1) 推荐(1) 编辑
摘要:【Hihocoder1413】Rikka with String(后缀自动机) 题面 "Hihocoder" 给定一个小写字母串,回答分别把每个位置上的字符替换为' '后的本质不同的子串数。 题解 首先横跨' '左右的串一定恰好只会出现一次,所以直接统计答案。 那么剩下的部分就是左右的本质不同的子串 阅读全文
posted @ 2018-12-27 21:20 小蒟蒻yyb 阅读(476) 评论(0) 推荐(0) 编辑
摘要:【LOJ 6041】事情的相似度(后缀自动机) 题面 "LOJ" 题解 $\mbox{YCB}$搬了这道题目。。。$\mbox{QwQ}$ 还是用到$lcp$就是$parent$树上的$LCA$的$len$。 每次询问显然就是区间内点的贡献。 那么考虑所有可能出现的点对。 显然对于两个子串而言,只会 阅读全文
posted @ 2018-12-27 19:42 小蒟蒻yyb 阅读(762) 评论(0) 推荐(0) 编辑
摘要:【BZOJ3413】匹配(后缀自动机,线段树合并) 题面 "BZOJ" 题解 很好的一道题目。 做一个转化,匹配的次数显然就是在可以匹配的区间中,每个前缀的出现次数之和。 首先是空前缀的出现次数,意味着你会去匹配第一个字符。 然后是第一个字符的出现次数,意味着你回去匹配前两个字符。 如此下去就是最后 阅读全文
posted @ 2018-12-27 17:44 小蒟蒻yyb 阅读(509) 评论(0) 推荐(1) 编辑
摘要:【BZOJ3879】SvT(后缀自动机,虚树) 题面 "BZOJ" 题解 看着这个东西,询问若干个前缀两两之间的$lcp$? 显然$lcp$就是$SAM$构建出来的$parent$数上的$LCA$所代表的长度。 那么这样子就转为了树型$dp$。 然后发现是前缀?把串转过来就是后缀了。 $\sum t 阅读全文
posted @ 2018-12-27 15:58 小蒟蒻yyb 阅读(611) 评论(0) 推荐(0) 编辑
摘要:【CF700E】Cool Slogans(后缀自动机) 题面 "洛谷" "CodeForces" 题解 构建后缀自动机,求出后缀树 现在有个比较明显的$dp$ 设$f[i]$表示从上而下到达当前点能够满足条件的最优值 只需要检查父亲节点是否在当前串中出现过两次就行了 这个判断用$endpos$来判断 阅读全文
posted @ 2018-05-31 16:38 小蒟蒻yyb 阅读(1365) 评论(0) 推荐(0) 编辑
摘要:【BZOJ5137】Standing Out from the Herd(后缀自动机) 题面 "BZOJ" "洛谷" 题解 构建广义后缀自动机 然后对于每个节点处理一下它的集合就好了 不知道为什么,我如果按照拓扑序从下往上合并是错的 但是把$parent$树建出来再合并就对了。。 cpp inclu 阅读全文
posted @ 2018-05-28 15:25 小蒟蒻yyb 阅读(446) 评论(2) 推荐(0) 编辑
摘要:【CF666E】Forensic Examination(后缀自动机,线段树合并) 题面 "洛谷" "CF" 翻译: 给定一个串$S$和若干个串$T_i$ 每次询问$S[pl..pr]$在$T_l..T_r$中出现的最多次数,以及出现次数最多的那个串的编号。 题解 好题啊。 我们对于所有的$T$串构 阅读全文
posted @ 2018-04-12 09:17 小蒟蒻yyb 阅读(1533) 评论(0) 推荐(0) 编辑
摘要:【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机) 题面 "BZOJ" "洛谷" 题解 裸的广义后缀自动机??? 建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括了 然后读入串直接匹配就好了 cpp include include include inc 阅读全文
posted @ 2018-04-02 19:04 小蒟蒻yyb 阅读(467) 评论(3) 推荐(0) 编辑
摘要:【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机) 题面 自从有了DBZOJ 终于有地方交权限题了 题解 很明显,只出现了一次的串 在$SAM$的$right/endpos$集合大小一定为$1$ 换句话说,在$parent$树上是叶子节点 找到所有这样的节点, 假设它的$le 阅读全文
posted @ 2018-04-02 17:09 小蒟蒻yyb 阅读(561) 评论(2) 推荐(0) 编辑
摘要:【BZOJ4516】生成魔咒(后缀自动机) 题面 "BZOJ" Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。 例如 S=[1,2,1] 时,它的生成 阅读全文
posted @ 2018-03-14 22:13 小蒟蒻yyb 阅读(278) 评论(3) 推荐(0) 编辑
摘要:【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 "BZOJ" "洛谷" 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 然后这个拆分很像一个$dp$ 同时,要求的东西很像一个可以二分的样子 所以二分一个答案,考虑 阅读全文
posted @ 2018-03-13 20:24 小蒟蒻yyb 阅读(331) 评论(2) 推荐(0) 编辑
摘要:【CF235C】Cyclical Quest(后缀自动机) 题面 "洛谷" 题解 大致翻译: 给定一个串 然后若干组询问 每次也给定一个串 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其旋转的串在给定的串中出现了多少次 显然,串可以旋转,那么考虑在后面再接一份就行了 匹配的话就是后 阅读全文
posted @ 2018-02-24 21:12 小蒟蒻yyb 阅读(399) 评论(8) 推荐(0) 编辑
摘要:【BZOJ2882】工艺(后缀自动机) 题面 "BZOJ权限题,良心洛谷" 题解 还是一样的,先把串在后面接一遍 然后构建$SAM$ 直接按照字典序输出$n$次就行了 阅读全文
posted @ 2018-02-21 20:22 小蒟蒻yyb 阅读(297) 评论(0) 推荐(0) 编辑
摘要:【BZOJ3926】诸神眷顾的幻想乡(后缀自动机) 题面 "BZOJ" 题解 广义后缀自动机啦 求多个串的不同子串个数? 当然是后缀自动机,最后只要把$longest parent.longest$求个和就好啦 那么这题怎么建后缀自动机 能够把所有子串都丢进去呢? 当然不用从每一个节点开始 把树建出 阅读全文
posted @ 2018-02-21 19:54 小蒟蒻yyb 阅读(412) 评论(3) 推荐(1) 编辑
摘要:【BZOJ3277】串(后缀自动机) 题面 "BZOJ" 题解 广义后缀自动机??? 照着别人的打了一遍。。 相当于每个串都构建一个后缀自动机 构建完一个串之后,直接把当前的last指回root就行了??? 好吧,我觉得我看了一个假的广义后缀自动机。。 不过这道题这样就行了 考虑如何计算一个串在多少 阅读全文
posted @ 2018-02-21 17:25 小蒟蒻yyb 阅读(384) 评论(5) 推荐(1) 编辑
摘要:【BZOJ3238】差异(后缀自动机) 题面 "BZOJ" 题解 前面的东西直接暴力算就行了 其实没必要算的正正好 为了方便的后面的计算 我们不考虑$i,j$的顺序问题 也就是先求出$\sum_{i=1}^n\sum_{j=1}^n[i\neq j]len[i]$ 然后对于每个后缀树上的节点,减去一 阅读全文
posted @ 2018-02-16 11:00 小蒟蒻yyb 阅读(332) 评论(2) 推荐(0) 编辑