省选集训-字符串杂题
省选集训-字符串杂题
基础子串结构太ex就不看了
CF1827C
考虑如何将一个由若干偶回文串拼接而成的串分解开。
容易发现每次从后往前删掉最短回文串就是对的。
所以问题变成求
则可以
CF1913F
屑题。
考虑计算出
考虑使用 manacher 求出原本的各个回文中心以及回文半径,将其往外扩张一个单位后(这个位置失配)再使用哈希求出最长长度,就可以对
以及
考虑求出
区间加等差数列别推错了,就尴尬了。
P10716
注意到
那么找到最长的
考虑失配树(
可以倍增,问题变为如何判断。
注意到调和级数求和,因此对于每个前缀
那么就只剩下一个判断了。
找的话,
P11150
关于讲课ppt是错的这件事。
要最小化原串的字典序,那么首先就要找到改后第一个与原串不同的位置
可以对原串建立一个SAM,然后将
那么首先就要求了
这样我们就找到了一个最优的接入位置
稍加画图可以发现,对于效果相同的接入位置,那么一定是原串匹配上了
所以倍增往前跳的循环节个数,然后哈希求出新的方案里得到的新串哈希值是否与原本串相同即可。
CF1975G
首先做一些讨论:
不含 ,可以直接判断 都含 ,将第一个 前面的以及最后一个 后面的位置进行匹配判断,判断通过显然有解。 仅有一个含 ,类似 先去掉第一个 以及最后一个 前/后面的串。
那么一般地,可以看作
贪心地,我们动态维护
考虑到单次匹配代价太大,需要将单次匹配复杂度降至
很厉害的地方是将
然后就考虑
这可以拆为三次差卷积计算。
P11291
注意到
但是性质更好的是固定
则显然
但是注意到最远的,那么一定
而注意到对于跳跃方案:
形式地说,设
因此就变成了跳
对于问题一是好做的,相当于只需要 dfs 时维护一个链和,而问题二也可以变成若干区间加等差数列,可以二阶差分解决。
CF1975H
考虑到如果我们要让最大子串最小,那么设
且最大子串一定是一个后缀,这是显然的。
因此这相当于是确定下了后缀的最后面是一个
所以当最大字符数小于等于其余字符数的时候,我们找到了一个让问题规模减半的方法。
但
事实上,考虑这样一个贪心:
维护
,初始化为 都为 ,设其余字符排序后是 ,那么我们每次将 的 按顺序加上 ,这样填完了一轮之后再将 变成当前末尾最大的 的首次出现为止(也即 )
这样做显然是对的,我们保证了前面尽可能小,且后续越往后越大,且“变大量”更小。
那么在最大字符数大于其余字符数后怎么办?事实上可以采用同样的处理办法,但是我们要预处理处理结果(保证复杂度)
这个处理结果相当于每个其余字符前面多了相同数量且最多个
保证每次递归问题规模减半,问题解决。
CF2053G
考虑单次操作的过程,不妨设长串为
若
那么就只需要处理
不妨设
显然,我们至少需要撤回
同时,我们声称,我们至多需要撤回
-
当撤回
次可以匹配,说明 是 的真前缀。 -
如果撤回
次可以匹配,则撤回 次也可以匹配(这是显然的)那么这就说明
,也就说明 是 的循环节,与 无共同循环节不符。 -
同理撤回更多次的情况也是一样的。
同时,如果撤回
那么我们每次跳跃都是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!