1 条题解

  • 0
    @ 2026-8-20 10:11:44

    题解

    思路

    ss 无限重复得到周期字符串。若 tt 在某个模 s|s| 的起点出现,就可以尝试在偏移 t|t| 后继续接上另一个 tt。这些起点构成一个每点至多一条出边的函数图;出现环表示可以无限连接,否则最长路径长度就是答案。

    做法

    子任务一:直接枚举重复次数

    有限答案不会超过 s|s|:若连续放置超过 s|s|tt,相邻两次放置的起点模 s|s| 必有重复,从而形成可以无限重复的周期。

    因此可以依次构造 tit^i,并把 ss 重复到足以覆盖所有模 s|s| 起点及目标长度,再直接查找 tit^i 是否出现。若 i=s+1i=|s|+1 仍可出现,答案为 1-1;否则最后一个可出现的 ii 即为答案。

    子任务二:逐起点比较与函数图

    枚举 p=0,1,,s1p=0,1,\ldots,|s|-1,逐字符比较 tt 与从循环字符串 ss 的位置 pp 开始的长度 t|t| 片段,标记哪些起点可以放置一个 tt

    对每个合法起点 pp,若 q=(p+t)modsq=(p+|t|)\bmod |s| 也合法,就连边 pqp\to q。若函数图存在环,沿环可以放置任意多个 tt,答案为 1-1;否则在无环图上求最长路径的节点数。

    满分算法

    逐起点比较最坏需要 O(st)O(|s||t|)。为了线性标记合法起点,只需取循环字符串 ss 的前 s+t1|s|+|t|-1 个字符,并用 KMP 在其中查找模式串 tt。这样每个模 s|s| 的起点对应的长度 t|t| 片段都恰好被检查一次。

    得到合法起点后仍建立同一函数图。可用访问状态判环,并在路径回退时计算最长链;实现时使用显式数组和路径,避免递归深度达到 5×1055\times 10^5

    复杂度

    n=s,m=tn=|s|,m=|t|。直接枚举层只用于 n,m10n,m\le 10。中等算法时间复杂度为 O(nm)O(nm),空间复杂度为 O(n)O(n)

    满分算法的时间复杂度为 O(n+m)O(n+m),空间复杂度为 O(n+m)O(n+m)

    正确性说明

    从合法起点 pp 放置一个 tt 后,下一个 tt 必须从 (p+m)modn(p+m)\bmod n 开始,因此任意连续的 tt 恰好对应函数图中的一条路径。反之,图中每经过一个合法节点,就能在循环字符串中继续放置一个完整的 tt,所以任意路径都对应题目中的一个可行重复次数。

    若图中存在环,可以沿环无限行走,故任意大的重复次数都可行,答案为 1-1。若图无环,所有路径有限,最长路径的节点数就是能够连续放置的最多 tt 数量。

    KMP 扫描的循环前缀覆盖了每个模 nn 起点及其后 mm 个字符,因此它标记的合法起点集合与逐起点定义完全一致。由此满分算法输出正确。

    • 1

    信息

    ID
    922
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者