1 条题解
-
0
题目理解
我们定义:
- 有界单词:存在 ,使得长度为 的前缀 = 长度为 的后缀。
- 无界单词:不存在这样的 。
换句话说,有界单词就是 存在非零的 border(KMP 中的概念),无界单词就是 没有非零的 border。
问题转化
长度为 的字符串,由
a和b组成,问:- 无界单词的个数。
- 无界单词中字典序第 小的。
思路
1. 无界单词的计数
设 表示长度为 的无界单词的数量。
总单词数 。关键性质:
一个字符串有非零 border 当且仅当它的最短周期 ,且 整除 。
更确切地说,一个字符串的最小周期 与它的最长 border 长度 有关系:。无界单词就是 最小周期 = n 的单词。
容斥/递推方法
设 表示长度为 的无界单词数。
所有长度为 的单词可以分为:- 最小周期 = 的(无界单词)
- 最小周期 = 的,其中 是 的真因子。
于是: 因为对于每个最小周期 ,它对应一个长度为 的串,由长度为 的无界单词重复 次得到。
由莫比乌斯反演: 其中 是莫比乌斯函数。
这样我们可以 枚举 的因子,计算 。
2. 构造第 小的无界单词
我们要按字典序构造第 小的无界单词。
方法:
从前往后逐位确定,每次尝试放a,然后计算以当前前缀开头的无界单词数量,如果 大于这个数量,就改为放b并减少 。
如何计算以给定前缀 开头的无界单词数量?
设当前前缀长度为 ,我们要求长度为 的无界单词且前缀是 的数量。
考虑 的 border 结构(KMP 的 fail 数组),这会影响后续字符的限制。
关键:
当我们已经确定了前 个字符,我们要求整个串是无界的,即整个串没有非平凡的 border。
但是 border 可能跨越已确定部分和未确定部分。
我们可以在构造时维护一个“禁止 border 长度”的集合。
具体地,假设当前前缀是 ,我们考虑如果整个串有一个 border 长度 ,这意味着:- 。
- 如果 ,那么 必须等于 。
- 如果 ,那么 必须等于 ,并且 是未确定部分。
为了简化,我们可以用 动态规划 + KMP 自动机 的方法:
定义 = 从位置 开始,当前 KMP 状态(即匹配前缀函数值)为 时,能构成无界单词的方案数。
KMP 状态 表示当前前缀与后缀的最长匹配长度。
无界条件:最终在 时, 必须等于 0(否则有非零 border)。
计算方式
我们预处理前缀 的 KMP 数组 ,然后从 开始,KMP 状态 就是 (如果 )。
然后我们进行 DP:
- 从 到 :
- 如果 ,则检查 是否为 0,是则方案数 = 1,否则 0。
- 否则,尝试两种字符
a和b,更新 KMP 状态,累加方案数。
这里 DP 可以用记忆化搜索,状态 , 从 到 ,。
3. 整体算法
- 对于每组数据 :
- 用莫比乌斯反演计算 。
- 逐位构造第 小的无界单词:
- 从空串开始,KMP 状态 。
- 对于每一位,先尝试放
a,计算以当前前缀开头的无界单词数量 。 - 如果 ,则这一位确定为
a,保持 不变。 - 否则,确定为
b,。 - 更新 KMP 状态。
- 输出结果。
复杂度
- 计算 :。
- 构造第 小的单词:每次计算方案数需要 DP(状态数 ),总复杂度 对于 可接受。
- 1
信息
- ID
- 4839
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者