1 条题解

  • 0
    @ 2025-10-22 17:51:26

    题意理解

    我们有一个长度为 mm 的字符串 tt(基本句子),将它无限重复得到 tt^\infty

    给定字符串 ss(长度为 nn),定义有意义的语义片段为:

    • 长度等于 nn
    • 字典序小于 ss

    问有多少个 tt(长度恰好为 mm),使得在 tt^\infty 中能找到至少一个有意义的语义片段。


    核心难点

    1. 无限重复t=tttt^\infty = ttt\cdots
    2. 子串字典序比较:需要在无限串中找长度 nn 的子串 <s< s
    3. 计数问题:统计满足条件的 tt 的数量

    关键思路:转化为自动机与 DP

    第一步:补集转化

    设总方案数为 26m26^m,我们计算不包含任何有意义语义片段的 tt 的数量,然后用总数减去。

    即:tt^\infty 中所有长度 nn 的子串都 s\geq s


    第二步:分析无限重复中的子串

    tt^\infty 中,所有长度 nn 的子串都是 tt 的某个循环移位加上 tt 的前缀。

    更准确地说,对于任意起始位置 ii,子串为:

    t[imodm]t[(i+1)modm]t[i \bmod m] t[(i+1) \bmod m] \cdots

    取前 nn 个字符。


    第三步:建立自动机

    我们需要检查 tt^\infty 是否满足:所有长度 nn 的子串 s\geq s

    这等价于:对于 tt 的每个循环移位,从该位置开始与 ss 比较时,一旦发现某个字符大于 ss 的对应字符,后面就不用管了;如果一直相等到某个位置,必须保证下一个字符不小于 ss 的下一个字符

    实际上可以建立 ssKMP 自动机,状态表示当前匹配 ss 的前缀长度。


    第四步:关键观察

    经过分析,tt^\infty 中所有长度 nn 的子串 s\geq s 当且仅当 tt 本身是 ss 的某个前缀的周期重复,且满足特定的字典序条件。

    更具体地说:

    • ss 的最长 border 为 bb(即 KMP 中的 fail 指针)
    • 那么 tt 必须满足:ttss 的前缀,或者 tt 在某个位置比 ss

    实际上,tst^\infty \geq s 当且仅当 tst^\infty \geq s 从任意位置开始比较都成立


    算法框架

    1. 构建 KMP 自动机

    预处理 ss 的 fail 数组 next[i]next[i]

    2. DP 状态定义

    dp[i][j]dp[i][j] 表示:

    • 已经确定了 tt 的前 ii 个字符
    • 当前在 KMP 自动机中匹配到状态 jj(即匹配了 ss 的前 jj 个字符)
    • 且到目前为止,tt 的前缀与 ss 的前缀关系满足"不包含有意义语义片段"的条件

    3. 状态转移

    对于第 i+1i+1 个字符 cc

    • 如果 c>s[j+1]c > s[j+1]:那么从这个位置开始已经大于 ss,是合法的,可以转移到某个特殊状态
    • 如果 c=s[j+1]c = s[j+1]:继续在 KMP 自动机上匹配
    • 如果 c<s[j+1]c < s[j+1]:这个分支会导致出现 <s< s 的子串,不合法

    4. 处理无限重复

    由于 tt 会无限重复,我们需要确保从 tt每个位置开始与 ss 比较都满足条件。

    这可以通过在 DP 中强制要求:当匹配到 tt 的末尾时,下一个字符是 t[0]t[0],继续在自动机上转移。


    关键公式

    f[i][j]f[i][j] 表示长度为 iitt 前缀,在自动机状态 jj,且满足条件的方案数。

    转移:

    • 枚举下一个字符 cc
    • 计算新状态 jj'
    • 如果会导致字典序 <s< s,跳过
    • 否则累加到 f[i+1][j]f[i+1][j']

    最终答案 = 26mf[m][j]26^m - \sum f[m][j](对所有合法状态 jj


    复杂度分析

    • 状态数:O(m×n)O(m \times n)
    • 转移:O(26)O(26)
    • 总复杂度:O(26mn)O(26 \cdot m \cdot n),对于 n,m2000n, m \leq 2000 可接受

    总结

    这道题的核心在于:

    1. 补集转化:计算不包含任何 <s< s 子串的 tt
    2. KMP 自动机:处理字符串匹配状态
    3. 循环约束:处理无限重复带来的周期性约束
    4. DP 计数:在自动机上进行动态规划统计合法方案

    通过将无限重复的问题转化为有限长度的约束条件,再利用自动机和 DP 进行精确计数,就能高效解决这个问题。

    • 1

    信息

    ID
    3748
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者