题意:给定字符串 ,找到他最长双回文串 的长度。双回文串定义为存在一个 使得 和 都是回文串。。
二分哈希求出所有回文中心的半径,设以 为中心的最长回文串为 。
我们发现当两个回文中心确定时,最长双回文串的长度唯一确定(左边界向左延伸一格必须先使右边界往里缩一格,否则左右两串出现重叠)。
枚举回文中心 ,找到一个最小的 使得 ,显然可以树状数组维护,在 的位置加入 。submission
题意:定义 和 是循环相同的,当且仅当 能够将一个后缀移到开头使得与 完全相同。
给出字符串 ,找到最大的 使得前缀 和后缀 是循环相同的。
枚举 的 border ,再找 的最长不重叠 border,令 ,发现把 的 border 掐头去尾就是 的 border。
反过来讲,有 ,设 ,当 时,令 ,然后不断减 直到合法,势能分析可以得出是线性的。
submission
更加巧妙的做法:把 重排成 ,那么两个 border 就是最靠前的两个相邻回文串(长度皆为偶数),和上题一样维护。
题意:给定一个长度为 的字符串 ,选出一个 使得满足 的字符串 的字典序最小,输出 。。
表示选了 得到字典序最小的 的 的前缀,显然有 ,+
表示拼接。
类似后缀数组 构造,求出 和 在 时的排名就可以当做两位数排序。
时间复杂度 ,基数排序可以省掉一个 。submission
题意:定义只有数字组成的字符串 是 x-prime 的当且仅当 且不存在一个子串和是 的真因子(不是他本身)。
给定字符串 和正整数 ,求 至少要删掉多少字符才不存在一个子串是 x-prime 的。。
注意到 很小,满足 x-prime 的字符串应当也很少,称之为非法子串。
删多少字符才能不存在非法子串的这类问题很容易想到构造 ac 自动机,最坏情况下,所有非法串构成的字典树大小只有 。
表示前 个字符匹配到 ac 自动机的状态 s 时需要删多少个才合法,枚举 删不删,时间复杂度 。submission
题意:给定字符串 , 次询问 出现至少两次的最长子串长度。。
考虑询问的本质,长度 合法等价于存在 满足 ,可以二分。
后缀排序求出 height 数组,,考虑 与 连边,那么 合法就是加入所有 之后 在同一连通块。
维护 表示与 在同一连通块的大于 的最小后缀编号,这个东西可以并查集的启发式合并实现,每个连通块开个 set 维护所有编号。
那么长度 到底怎么判断呢?区间查询 当中最小的 是否 ,显然可以线段树。
你当然可以离线。也可以维护持久化线段树 表示加入所有 后 的 值,时空复杂度皆为 。submission
题意:求连续出现次数最多的重复子串的连续出现次数,多测。。
枚举重复子串长度 ,每隔 放置一个关键点 (1-base)。
如果一个子串是 k-repeat 的,那么他一定恰好覆盖 个关键点。 这个 显然是可以二分的,考虑怎么 check。
单调队列维护长度为 的窗口内关键点所代表后缀以及前缀的排名,方便通过正串和反串的后缀数组求出 LCP 和 LCS(suffix)。
出现 (k, L) - repeat 当且仅当 ,其中 表示当前窗口内关键点表示后缀的 LCP。
枚举 填关键点是一个调和级数,直接做是双 log 的。
考虑一个关键点区间 ,如果 不小于 ,则称 是优秀的。显然如果 是优秀的,任意其子区间也是优秀的。
设 为右段点是 是的极大优秀区间,如果 优秀则 优秀,与 是极小左端点矛盾。因此 时左端点单调不降。
双指针代替二分,时间复杂度 。submission
题意:给定字符串 以及正整数 ,求:
数据范围:。
由于 对于 lcp 和 lcs 都是相同的,我们把他们接在一起,统计 处的 lcp。
如果 ,那么他对答案有 的贡献,其中:
可以 预处理。
考虑 的限制,否则相同子串不是极长。正难则反,容斥减掉 的情况。
问题转化为与 的 lcp 相关的一个式子,根据 sa 的经典套路,在 height 数组上单调栈维护 。submission
题意:给定 个串 以及其权值 , 次询问,每次给出一个文本串 ,设 表示 在 中的出现次数,求 的第 大值。
数据范围:。
把文本串放在原串 ac 自动机上跑,走到一个状态则将其 tag 加一,最终 等于 的终止节点所表示状态在失配树上的子树和。
考虑对所有走过的状态建出虚树,由于一共只走 步,虚树规模也是 的。
不难发现 与其虚树上的父亲 (不含)之间路径的 都是一样的,也就是说,我们把整棵失配树划分为 条 相同的链。
二分答案 ,问题转化为有多少结束状态满足 ( 趋向正无穷,忽略),树上主席树实现,时间复杂度 。
submission
题意:给定字符串 ,找到最大无交子串集 的大小,满足 是 的真子串(非本身)。
首先,将字符串翻转,限制转化为 是 的真子集。
观察1:如果大小 合法,一定存在一组方案解使得 。
由于是真子串,显然有 。考虑找到第一个长度大于 的位置,删掉前后缀使之成为 ,不会影响整个方案的合法性。
设 表示长度为 的前缀,强制使 等于 的结尾的最大合法长度。
观察2:。
对于任意 的方案,删掉 ,删掉 最后一个字符,能够得到一组 的长度为 的方案。即 ,与结论等价。
令 ,即前缀 最优方案 的左端点。
我们称 合法,当且仅当他是 一组方案的 ,注意这里的方案需要满足 ,不难发现若 合法,则所有 的后缀合法。
根据观察2可知,随着 的增大, 单调不降。考虑从 到 :
合法当且仅当存在一个合法串 满足 且与 和 之一相同。
考虑在 SAM 上对于每个状态 维护该状态所有右端点小于 的合法串的最大长度 。
那么 合法等价于 和 对应的状态中 的最大值大于等于 ,如果合法则跳过。
否则 ,此时需要更新所有右端点等于 的合法字符串,其中左端点范围是确定的 。
设 表示 的状态,现将 与 取 max,然后往上跳 的祖先,如果 已经是 了,不需要再往上跳;否则 。
时间复杂度均摊 。(一共就 个状态,每个状态被更新至多 次)submission
题意:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构