题目描述
有 个互不相同的字符串 。
希望求出二元组 的数量,满足 在 中出现过并且不存在 使得 在 中出现过, 在 中出现过。
思路点拨
考虑枚举最长的字符串 ,和 表示 的末尾节点。为了符合条件,我们对于同一个 只取最长的那个字符串。这个好用 维护。
现在有两个问题:算重,算多(算多 随便去重就可以)
算重可以用 记录去重。
时间复杂度 。
题目描述
有 次操作,每一次操作描述了第 个字符串,要么是单独一个字符,要是是在第 个字符串后拼接一个字符得到。
接下来又 次询问,每一次给出一个字符串问在第 个字符串中出现了多少次?
思路
考虑检出 。一个字符串 在第 个字符串中出现了多少次就相当于问这个字符串的末尾节点在 树的子树内有多少节点属于字符串 的。所以将询问离线下来,我们在 树上dfs,同时维护 树上的单点加,区间求和即可。
时间复杂度 。
题目描述
给出 个字符串 。有 次询问,每一次询问问 在 中出现了多少次?
思路
我们不喜欢区间询问,所以把他拆分为了前缀询问,之后考虑离线。
对于一个字符串,我们暴力的将其在 树上的全部节点到根的路径都增加 。询问就相当于单点查询。这可以使用树剖维护。
时间复杂度 。
题目描述
现在有一个字符串 ,希望求出一个子串 满足 尽量大。其中 表示字符串 的最小整周期。
思路点拨
我们考虑枚举 的长度 ,接下来枚举一个起点 。这时字符串 的循环次数就是 ,至于正确性读者画图就知道了。这样我们得到了 的做法。
我们不需要枚举每一个起点,只需要枚举 的这些端点就足够了。每一次使用后缀数组往前后扩展公共前后缀。更加具体而言,我们的扩展左端点是 ,扩展右端点是 。大家可以自己多多画图理解为什么。
和 使用后缀数组优化,时间复杂度 预处理加上 求解就是 的。
题目描述
维护一个字符串集合,支持如下操作:
- 增加一个字符串
- 删除一个字符串
- 给出一个字符串 ,问集合中字符串在 中出现的次数和。
强制在线
思路点拨
如果不考虑空间的话,我们可以使用时间轴 套 做到 的时间复杂度,但是空间复杂度为 ,所以是不可以通过的。
我们考虑优化空间,可以在增加字符串/删除字符串的时候维护 划分的变化(二进制分组),做到空间线性。
的特殊运用
优化字符串匹配
题目描述
现在有一个字符串 ,需要支持如下操作:
-
字符串 单个位置的修改
-
给出一个字符串 问在 中出现的次数。
思路点拨
我们开 个桶,第 个桶存放了 的下标 。
匹配维护可行的端点桶,每一次对相应的桶移位,取位运算与即可。过程使用 优化一下没什么好讲的。
时间复杂度 ,空间复杂度 。其中 表示字符集大小。
含有通配符的字符串匹配
题目描述
现在有两个字符串 ,均有小写字母和通配符组成。通配符可以替换为任何字符,问 在 中出现的次数。
思路点拨
我们给每一个字符赋值,但是通配符的权值为 。字符串 的第 个位置权值 定义为:
当 等于 的时候就是一次匹配,大家可以根据赋值的方式理解一下。如果 ,那么 ;如果存在通配符,那么 和 中存在 。
考虑推一下式子:
这时三个不同的卷积,变换一下下标之后 即可。时间 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现