1 条题解
-
0
题解
思路
把 无限重复得到周期字符串。若 在某个模 的起点出现,就可以尝试在偏移 后继续接上另一个 。这些起点构成一个每点至多一条出边的函数图;出现环表示可以无限连接,否则最长路径长度就是答案。
做法
子任务一:直接枚举重复次数
有限答案不会超过 :若连续放置超过 个 ,相邻两次放置的起点模 必有重复,从而形成可以无限重复的周期。
因此可以依次构造 ,并把 重复到足以覆盖所有模 起点及目标长度,再直接查找 是否出现。若 仍可出现,答案为 ;否则最后一个可出现的 即为答案。
子任务二:逐起点比较与函数图
枚举 ,逐字符比较 与从循环字符串 的位置 开始的长度 片段,标记哪些起点可以放置一个 。
对每个合法起点 ,若 也合法,就连边 。若函数图存在环,沿环可以放置任意多个 ,答案为 ;否则在无环图上求最长路径的节点数。
满分算法
逐起点比较最坏需要 。为了线性标记合法起点,只需取循环字符串 的前 个字符,并用 KMP 在其中查找模式串 。这样每个模 的起点对应的长度 片段都恰好被检查一次。
得到合法起点后仍建立同一函数图。可用访问状态判环,并在路径回退时计算最长链;实现时使用显式数组和路径,避免递归深度达到 。
复杂度
设 。直接枚举层只用于 。中等算法时间复杂度为 ,空间复杂度为 。
满分算法的时间复杂度为 ,空间复杂度为 。
正确性说明
从合法起点 放置一个 后,下一个 必须从 开始,因此任意连续的 恰好对应函数图中的一条路径。反之,图中每经过一个合法节点,就能在循环字符串中继续放置一个完整的 ,所以任意路径都对应题目中的一个可行重复次数。
若图中存在环,可以沿环无限行走,故任意大的重复次数都可行,答案为 。若图无环,所有路径有限,最长路径的节点数就是能够连续放置的最多 数量。
KMP 扫描的循环前缀覆盖了每个模 起点及其后 个字符,因此它标记的合法起点集合与逐起点定义完全一致。由此满分算法输出正确。
- 1
信息
- ID
- 922
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者