
SAM
文章平均质量分 79
zsyzClb
这个作者很懒,什么都没留下…
展开
-
[八省联考 2018] 制胡窜
值得一题的是,我的代码在洛谷一遍就过了,但是在loj拿了0分,测试一下发现本地是对的,但是loj评测机的环境就是错的,我尝试交打印调试信息的代码,结果发现加了几个cout输出就正确了,非常奇怪。相等的子串,并且两两相交部分不超过1,那么一定是任意整数对都满足条件,我们把这种情况特判一下,剩下的情况就有。对应的点为 p,考虑 p 的 endpos 集合,假设其大小为 m。,只要保证选择的空隙都在最左边的出现位置和最右边的出现位置之间即可。为不与最左边出现位置相交的出现位置的 endpos 集合,然后枚举。原创 2025-01-20 22:31:59 · 390 阅读 · 0 评论 -
CF700E Cool Slogans
因此我们只需实现两个功能:(1)查找某一段下一个出现的位置,可以用sam和线段树合并处理;(2)求等差数列的长度,也就是新加的那一段重复出现了多少次,可以用哈希+二分来求。就是kmp一连串的border,而kmp的border有一个常用的性质:会形成log段等差数列。我看题解里没有人用kmp里border的性质来做,就来写一发。的子串,使得后一个在前一个中至少出现两次(可以有重叠部分)。以此类推,直到找不到位置。然后统计出现次数,对每个。手玩一下,发现只需要先固定一个起点。求完以后取最大值即可。原创 2025-01-20 11:54:42 · 554 阅读 · 0 评论 -
CF1063F String Journey
这道题给我了一个重要的启发:就是一下子理不清楚思路的时候可以打一个暴力,然后再思考怎么优化这个暴力。给你一个字符串,让你从中提取处最多的连续子串,使得这些连续子串在顺序保持不变的情况下满足后一个是前一个的真子串(必须非空)。也有单调性,所以可以用倍增来找到点,点内开个vector存段,在点内寻找的时候用二分,就能做到时间空间都是。1.后一个的长度是前一个的长度+1,即在后一个串的前面或者后面多加上一个字母,接下来我们强制这个条件满足。先把字符串反转,那么条件就变成了前一个是后一个的子串了。原创 2025-01-19 12:56:14 · 498 阅读 · 0 评论 -
P5576 [CmdOI2019] 口头禅
如果这个节点的儿子已经贡献了这一条线段,那么这个节点就不需要再贡献这条线段了。也就是说只要在这个树上启发式合并,合并后新产生的线段数量。然后就把询问离线一下,拿一个树状数组扫描就可以了。先建出广义SAM,然后考虑每个节点贡献的线段。个01串的最长公共子串长度。原创 2025-01-11 09:41:45 · 244 阅读 · 0 评论 -
[十二省联考 2019] 字符串问题
给你一个字符串s,然后有na个A型串和nb个B型串,这些串都是s的一个子串,以区间的形式给出。有些A支配了B,给出支配关系。现在要你以某种顺序选出A型串(可以重复),假设选择了k个,使得对于每一个i∈1k−1,满足有一个被其支配的B串为下一个A串的子串,让你求最大长度和。原创 2024-12-25 11:16:57 · 889 阅读 · 0 评论 -
洛谷P6292 区间本质不同子串个数
对于每个i,都要把子串[1,i]所处的点到根节点全部节点的最大endpos都赋值为i,这就相当于lct的access操作,当然access中每次splay以后都要把原来的贡献剪掉。从1到n考虑所有R=i的询问,显然parent-tree上每个节点应该要考虑最大的endpos,然后要给。给你一个字符串,每次询问输出区间[L,R]生成的子串的本质不同的子串。,如果强制在线只需把修改放到可持久化线段树上就行了。,全部加上1,查询就是。原创 2024-12-16 14:41:14 · 780 阅读 · 0 评论 -
SP687 Repeats
题意给定字符串,求重复次数最多的连续重复子串思路有两个方法。原创 2024-12-14 23:30:01 · 990 阅读 · 0 评论 -
线段树合并的复杂度证明
有时候线段树合并的时候要新建节点,因此我就很好奇这样的空间复杂度到底是多少(显然时间复杂度和空间复杂度是一样的)。因为parent-tree上线段树合并是为了维护endpos集合,因此最终会合并成一棵满二叉树。最近在做sam,经常遇到要在parent-tree上面线段树合并的题目。考虑每一个节点需要合并的最多次数,也就是叶子节点的个数。常数为2,一部分是建的链,一部分是合并产生的新的点。我们知道,每一层总叶子都是n,有log层。,n是字符串长度而不是sam的点数。我就试着自己证明一下。原创 2024-12-13 10:00:04 · 253 阅读 · 0 评论 -
[HEOI2016/TJOI2016] 字符串
第二段没有超过a的限制,那么很明显答案就是区间的长度,因为区间长度递减,因此我们只需要统计第一个没有超过a的限制点。第一段超过a的限制,仔细观察发现ed会随着你往上跳单调递增,因此我们只需要用倍增直接跳到最上面的一个超过a的限制的点,然后求答案即可。不用考虑子树里面的点,因为子树里面的长度肯定都超过要求。然后就需要考虑一下a的边界条件,然后就会发现如果从d所对应的点一直往上跳,那么点就会分成两段。我们肯定要找到当前的点的endpos集合中<=b并且最大的一个,记为ed,这样才能求出贡献。原创 2024-12-12 18:48:08 · 714 阅读 · 0 评论 -
洛谷 P5212 SubString
给你一个字符串,每次操作可以在这个字符串后面多插入一个字符串,或者查询某个字符串的出现次数,并且强制要求在线。很明显需要先建一个SAM,然后在parent-tree上面求解,要维护某个点的子树和。但是现在问题来了,parent-tree是会不断变化的,所以我们要用lct维护。每次插入一个点,就往这个点到1的路径上把每个点的权值加上1。原创 2024-12-06 14:09:39 · 175 阅读 · 0 评论 -
洛谷P3975 [TJOI2015] 弦论
最近开始做command_block的题单https://www.luogu.com.cn/training/5322#problems。现在得到了parent-tree,容易知道,儿子所代表的字符串一定比父亲的大(因为父亲是其前缀)。因为比较字典序需要从头开始比,但是SAM只能处理endpos,所以我们把字符串反着来建。我们肯定要先预处理出每个点endpos中的任意一个元素,然后假设父亲所代表的长度区间为。求一个字符串中第k小的子串是什么,要求能够相同统计多次或者统计一次。,那么只需要比较儿子之间的。原创 2024-11-16 09:10:45 · 268 阅读 · 0 评论