字符串进阶题目选做
1|0字符串进阶
一些不那么裸的字符串题,甚至出现了 parent 树优化建图这种离谱的东西。
前置知识:kmp,字符串哈希,AC 自动机,SA,SAM,Manacher
1|1CF914F Substrings in a String
题意:给定字符串,要求支持单点修改,询问时给出字符串,求在
思路:考虑一般的字符串维护方法都不支持修改,因此需要另辟蹊径。
考虑用 bitset 来维护字符串匹配。
其实很暴力,就是先求出每个字符的每个出现位置,然后按顺序扫描文本串,把新加的字符的 bitset 左移
复杂度是优秀的
1|2CF1207G Indie Album
题意:有
接着是
思路:AC机模板题。
先离线询问,然后对
虽然
1|3CF1483F Exam
题意:给定互不相同的字符串
是 的子串。- 不存在
满足 是 的子串且 是 的子串。
思路:AC 自动机进阶。
首先可以发现,答案的的上界是
我们先对于
后者是 AC 机的简单应用,前者可以在求出每个前缀的答案后再从后往前扫一遍去掉被覆盖的来求出,这样就做完了。
1|4P3735 [HAOI2017] 字符串
题意:给出一个字符串
给定一个常数
一、
二、对于所有
如果
思路:条件可以转成
对所有
对于 S,处理出每个前缀在 AC 机上匹配到
然后就是统计答案。我们遍历一遍 fail 树,到达
不过这样计算会算重复,减去每个节点上挂
1|5P4022 [CTSC2012] 熟悉的文章
题意:给出字符串集合
思路:考场上想到了大概,就是没发现转移区间的左端点是递增的,因为每次匹配的长度不会超过前一次匹配的长度 +1,于是dp可以用单调队列优化到
1|6P5319 [BJOI2019] 奥术神杖
思路:发现答案式子与指数有关,于是可以两边同时取
1|7And Yet Another Bracket Sequence
题意:有一个括号序列(不保证合法),你能够进行以下两个操作:
-
在任意位置插入一个左括号或者右括号;
-
将序列最末的括号移到最前。
经过若干次操作后,得到的最短的合法括号序列是什么?若多解,输出字典序最小的。
思路:首先显然是贪心,显然是将一段后缀转到前缀后再在前面、后面加括号。加括号的数量是确定的,因此关键在于一开始转多长的后缀,这个可以根据合法括号串的性质来,直接判前缀最小值是否合法就行了,要求字典序最小可以用二分+哈希,也可以用SA。然后就做完了。
1|8P5284 [十二省联考 2019] 字符串问题
题意:给定字符串s以及两类区间,再给定一些从第一类区间连向第二类区间的边,一个第二类区间能连向一个第一类区间当且仅当前者是后者的前缀。每个第一类区间的价值是区间长度,求这张图上的最长路(或判断无限长)。
思路:好题。
算是 parent 树优化建边的普及题。
发现答案就是类似求最长路的东西,考虑建图。我们设
关键就在于怎么建边。对于和子串前缀有关的,我们考虑建反串的 parent 树,然后用倍增来定位子串,这样建边就是
然后我们发现,对于定位到同一个节点的子串,我们按其长度排序,然后从小的往大的连,这样就是
1|9P5576 [CmdOI2019] 口头禅
题意:求 01 串集合的区间最长公共子串。
思路:妙妙题。
想到了扫描线的做法,但是因为不知道一些结论,因此不会。
有小清新的广义SAM+线段树做法。
首先,我们建出广义SAM,然后给每个字符串赋一种颜色,在加入SAM时对遍历到的每个节点加入这个颜色。这样,一个点实际的颜色集合就是自身和所有儿子的颜色集合的并。于是询问就变成了求包含了
于是就想到了线段树合并,但是这样不好处理询问,于是考虑用 set 维护每个节点的颜色集合的连续段,然后采用启发式合并,这样询问就是二维数点问题。不过这道题中可以更简单地处理。具体地,我们把每个询问挂在左端点上,按右端点从小到大排序,然后按长度从大到小访问 SAM 上每个节点,然后遍历区间的所有询问,如果右端点包含了询问的右端点就可以直接记录答案,否则就等着之后处理。为了保证复杂度,维护一个区间右端点的最小值,然后只有右端点包含了最小值才处理,这样就可以保证复杂度。
最终复杂度
1|10Birthday
题意:给定 a,b
的字符串,保证它们两两不同。你需要去掉尽可能少的字符串,使得剩下的字符串中不存在某一个串是另一个串的子串。
思路:巨大混乱邪恶题。
先考虑怎么求出每一对串是否有包含关系。
我们把所有串的 AC自动机建出来,然后对于每个点,维护它在 fail 树上的最近的终止节点,然后对于每个终止节点,遍历它在 trie 树上的所有祖先,向这个祖先的最近的终止节点连边,然后用 floyd 传递闭包求出偏序集。
然后就是求最长反链,可以用二分图匹配解决。
1|11A task for substrings
题意:统计满足
思路:好题。
以为可以直接扫描线,然后才发现一每个右端点结尾的合法子串不是连续一段
先考虑如果询问的是前缀怎么做。我们预处理出
如果不是前缀,可以直接用
感觉这种解法和一类式子形如
求
1|12P2178 [NOI2015] 品酒大会
题意:对于每个长度,求有多少对后缀的 lcp 不少于这个长度和后缀权值乘积的最大值。
思路:从后缀的 lcp 入手不难想到后缀数组,而求出
考虑按
1|13P1117 [NOI2016] 优秀的拆分
题意:如果一个字符串可以拆分成形如 AABB 的四个部分,那么这就是合法的拆分方式。求一个字符串的所有子串的所有合法拆分方式的个数。
思路:首先,可以想到维护每个点往前有多少 AA 串,往后有多少 BB 串,那么答案就是
怎么快速计算
我们考虑每隔
如果
于是就剩下了
总的做法就是先进行后缀排序,然后枚举
1|14P2414 [NOI2011] 阿狸的打字机
题意:给一棵 Trie 树,多组询问一个点代表的字符串再另一个点代表的字符串中出现了多少次。
思路:考虑建出 AC 自动机,那么有
我们在 dfs 的过程中,只把当前子树里的点标成 1,然后把询问挂在
1|15P2444 [POI2000] 病毒
题意:给出若干个 01 串,求是否存在一个无限长的 01 串使得给出的串都不是这个串的子串。
思路:考虑建出 AC 自动机,那么我们把构造出来的串放进来匹配,就必须$$不经过所有终止节点,同时还要有环。
现在就是要找环。我们 dfs 一遍,记录一个点历史是否被访问过,同时记录一个点是否在栈中,如果访问到了已经入栈过的点就说明找到了答案。
1|16P4696 [CEOI2011] Matching
题意:给你两个排列 P 、H, 求 H 中 任意一段 连续的 排列 与P相同的序列
思路:因为是匹配,考虑用 kmp。
我们考虑套用 kmp 的过程,那么当前的数
匹配的过程也类似,实时维护当前区间的左端点,移动左端点时去掉贡献即可。
复杂度
1|17P9523 [JOISC2022] 复制粘贴 3
题意:构造长度为
- 输入 c,即
。 - 剪切,将
剪切到剪切板 ,并令 为空。 - 粘贴,即
分别有代价 A,B,C,求得到目标串的最小代价。
思路:设
直接转移复杂度很劣,考虑怎么优化。我们一加上
预处理出 kmp 数组,然后每次跳 next 来转移,这样做是
现在还需快速求出
复杂度
1|18P4384 [八省联考 2018] 制胡窜
题意:对于一个字符串
接着,我们定义
给定一个长度为
思路:不算太难,但是要分讨。
因为是子串相关,于是考虑用 SAM + 倍增来定位子串,难点在于计算贡献。
首先可以把转成在两个位置
考虑暴力枚举第一刀切的位置,如果
考虑优化。
如果
如果出现过,那么每一次的贡献就是使得
于是记
那么对于所有
首先要消除
关键在于
那么答案化简后就是
复杂度
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/18015641.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】