【笔记】字符串杂题选讲 2025.2.6
【笔记】字符串杂题选讲-范斯喆 2025.2.6
已完成 2 题代码:CF1975G、CF1975H
CF1827C Palindrome Partition
将所有偶回文串分解为极小的偶回文串,则分解的方案是唯一的,假如可以对所有
可以使用 manacher,只需要求
CF1913F Palindromic Problem
对于每个回文串,判断它什么时候能/不能计入答案。枚举回文中心,先考虑在回文半径中的回文串,是若干区间加等差数列;再考虑由修改回文半径外第一个字符产生的新的回文串,只有一个,可以暴力考虑贡献。
需要使用后缀数组求 LCP。
P10716 简单的字符串问题
建立 border 树,枚举答案是一段前缀
查询时从小到大扫描
而事实是,可以发现答案一定取在 border 树上的一段到根的链,所以树套树可以改成树上倍增。而预处理的部分可以用 Z 函数(扩展 KMP 算法)优化,即若当前匹配到
P11150 [THUWC 2018] 字胡串
这是什么东西?
先考虑去和
CF1975G Zimpha Fan Club
通过一系列比较,将两个字符串的两个头、两个尾都尽可能匹配掉,直到遇到 *
停止。如果此时两个字符串都有 *
就输出 Yes,然后判一下有串空掉的情况,现在就剩下一个字符串没有 *
(记作 *
(记作
如果没有 -
,那么这是一个 KMP 匹配问题,将有 *
的字符串按照 *
分段,用
如果有 -
,问题的瓶颈变成怎么匹配一个段并要求匹配位置尽可能靠前。这就是通配符匹配,匹配一段需要一次 FFT。
为了确保复杂度正确,假如当前
P11291 简单的字符串问题 2
以为是无意义堆难度,没想到是有意义的。令
可以感受到如果记
CF1975H 378QAQ and Core
我看不懂,但我大受震撼.jpg
https://www.luogu.com.cn/article/dtv8w2bs
https://www.luogu.com.cn/article/04teche7
CF2053G Naive String Splits
太牛了,首先假设我们要判定的两个字符串
但是这个做法是很危险的,事实上也是,对于
复杂度观察一下可以发现只有调和级数
题解怎么还有一页,原来可以线性。将
- 首先,对(\sum_{i = 1}^{n}\log(\frac{n}{i}))进行化简:
- 根据对数运算法则(\log(\frac{a}{b})=\log a-\log b),则(\sum_{i = 1}^{n}\log(\frac{n}{i})=\sum_{i = 1}^{n}(\log n-\log i))。
- 进一步展开得到(\sum_{i = 1}^{n}\log n-\sum_{i = 1}^{n}\log i)。
- 因为(\sum_{i = 1}^{n}\log n = n\log n)((\log n)是常数,(n)个(\log n)相加),所以原式变为(n\log n-\sum_{i = 1}^{n}\log i)。
- 然后,对(\sum_{i = 1}^{n}\log i)进行估计:
- 利用积分估计和式。我们知道函数(y = \log x)在区间([1,n + 1])上是单调递增的。
- 对于(\sum_{i = 1}^{n}\log i),有(\int_{1}^{n}\log xdx\leqslant\sum_{i = 1}^{n}\log i\leqslant\int_{1}^{n + 1}\log xdx)。
- 先计算(\int\log xdx),利用分部积分法,设(u=\log x),(dv = dx),则(du=\frac{1}{x}dx),(v = x)。
- 根据分部积分公式(\int u dv=uv-\int v du),可得(\int\log xdx=x\log x-\int x\cdot\frac{1}{x}dx=x\log x - x+C)。
- 计算(\int_{1}^{n}\log xdx=n\log n - n + 1)。
- 计算(\int_{1}^{n + 1}\log xdx=(n + 1)\log(n + 1)-(n + 1)+1=(n + 1)\log(n + 1)-n)。
- 所以(n\log n - n + 1\leqslant\sum_{i = 1}^{n}\log i\leqslant(n + 1)\log(n + 1)-n)。
- 接着,将(\sum_{i = 1}^{n}\log i)的估计结果代回原式:
- 因为(\sum_{i = 1}^{n}\log(\frac{n}{i})=n\log n-\sum_{i = 1}^{n}\log i),由(n\log n - n + 1\leqslant\sum_{i = 1}^{n}\log i)可得:
- (\sum_{i = 1}^{n}\log(\frac{n}{i})\leqslant n\log n-(n\log n - n + 1)=n - 1)。
- 由大(O)记号的定义,若存在正整数(n_0)和正的常数(C),使得当(n\geqslant n_0)时,(f(n)\leqslant Cg(n)),则(f(n)=O(g(n)))。
- 对于(\sum_{i = 1}^{n}\log(\frac{n}{i}))和(n),取(C = 1),(n_0 = 1),当(n\geqslant1)时,(\sum_{i = 1}^{n}\log(\frac{n}{i})\leqslant n)。
- 因为(\sum_{i = 1}^{n}\log(\frac{n}{i})=n\log n-\sum_{i = 1}^{n}\log i),由(n\log n - n + 1\leqslant\sum_{i = 1}^{n}\log i)可得:
所以(\sum_{i = 1}^{n}\log(\frac{n}{i}) = O(n))。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18701073
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统