P1117 [NOI2016] 优秀的拆分 题解
据说暴力用哈希扫可以拿到95分。
这一道题的思路是这个样子的:
我们首先准备两个数组a[]
和b[]
,分别表示以 结尾的形似AA的字串个数和以 开头的形似AA的字串的个数,最终答案其实就是 。
然后考虑如何求出这两个数组。
对于每一个位置,我们尝试枚举一个 ,然后求出当前位置 与 位置处的 lcp
与 lcs
。
当两者长度加起来不小于 的时候,就意味着我们可以找到至少一个长度为 的AA串。
为什么呢?
我们考虑从两个位置的 lcs
的开头处开始,分别向后截取出一段长度为 的串。
如果这个串被两者的 lcs
和两者的 lcp
拼起来组成的一个字串覆盖,那么我们就可以把这两个串拼起来,形成一个长度为 的AA串。
就像这样:

当两者长度加起来不够 时,我们截出来的两端字串就不保证一样。
不,应该是保证不一样,要不然两者的 lcp
还可以更长一点。
这样就拼不出来一个长度为 的AA串了。

如果两者甚至有重合,那么我们就可以挑出来多个字串。我们这些会累积到后面。

就是这样。
简单来说,我们需要做的就是:
- 枚举 ;这个操作的复杂度是
- 求
lcp
与lcs
;使用后缀数组即可。 - 区间加;差分即可。
上代码:
__EOF__

本文作者:Kaiser Wilheim
本文链接:https://www.cnblogs.com/kaiserwilheim/p/16209380.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/kaiserwilheim/p/16209380.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话