P8368 [LNOI2022] 串
首先我们可以说明,一定存在一个最优方案,使得最后一个串的右端点是 。因为如果不是 ,那么可以往后扩展一个,或者整体前移一位之后再往后扩展一位。
然后我们可以说明,如果后缀 存在一种方案使得其是最后一个,那么 也存在一种方案。
所以我们可以二分一个 ,然后 check 可不可行。
设当前区间为 ,那么每次就是 往前移动一位, 往前移动 位,当 的时候说明不可行。
如果当前区间 之后存在一个与其相同的串,那么就可以跳到后面去,同时我们发现,跳到后面去一定比继续往前走更优,因为如果跳到后面去,那么走到前面的时候一定更短,那么前面往后跳的话也一定能跳。
那么这个二分的 check 就是 的。预处理可以建立 SAM 找到每个后缀和后面的后缀的 LCP 最大值,总复杂度 。
等下,这个二分真的有必要吗?在位置 ,若长度 LCP 最大值,则这些长度一定可以循环跳完,那么对于位置 ,其能跳的最长串也就确定了,可以 求出,复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2023-01-12 1.8闲话
2023-01-12 12.11 闲话
2021-01-12 luogu P4027 [NOI2007] 货币兑换