1 条题解
-
0
题意理解
我们有一个无限长的 Thue-Morse 序列,定义:
给定一个 01 字符串 和整数 ,问有多少个 Thue-Morse 序列的连续子序列 满足:
- 是 的前缀
- 的长度 =
核心难点
- Thue-Morse 序列的结构特殊:具有自相似性
- 极大:最大 ,需要对数算法
- 需要高效判断和计数:哪些扩展是合法的连续子序列
关键观察:Thue-Morse 序列的性质
自相似性
Thue-Morse 序列可以递归生成:
- 从 开始
- 每次替换:,
也就是说:
- 位置 和 相同
- 位置 和 相反
问题转化
我们有一个前缀 ,要在后面添加 位,使得整个串是 Thue-Morse 序列的连续子序列。
关键思路:从某个起始位置 开始,取长度为 的子串,这个子串的前 位等于 。
递归求解框架
基础想法
设 表示以 为前缀,后面添加 位的方案数。
由于 Thue-Morse 序列的递归结构,我们可以将问题分解:
-
如果 能匹配序列中从偶数位置开始的一段:
- 那么 的每个字符 必须等于 (当 为偶数时)
- 这实际上要求 的偶数位和奇数位分别满足某种关系
-
更直接的方法:考虑 在序列中的出现位置
关键性质:递推关系
通过分析 Thue-Morse 序列的结构,可以发现:
对于字符串 和整数 , 满足:
-
基本情况:
- 如果 不是 Thue-Morse 序列的子序列:
- 如果 :检查 本身是否是连续子序列
-
递归情况:
- 如果 以 开头,考虑两种可能:
- 从某个偶数位置开始:,其中 是 的某种变换
- 从某个奇数位置开始:类似处理
- 实际上更精确的递推是:
- 如果 以 开头,考虑两种可能:
核心递推式
设 是当前模式, 是要添加的长度。
我们可以将 按位分解,利用 Thue-Morse 序列的生成规则:
规则: 和 有关系:
- 如果 是偶数:
- 如果 是奇数:
因此,如果我们知道 匹配从位置 开始的子串,那么:
- 必须等于 ,而 由 决定
实际算法:记忆化搜索
定义 :
-
边界情况:
- 如果 且 :返回 1(只有 本身)
- 如果 且 :考虑两种扩展方式
-
递归分解:
- 将 分成两部分:,其中 或
- 检查 是否是合法的 Thue-Morse 模式
- 如果能匹配,问题转化为 等子问题
具体递推关系
经过推导,可以得到:
对于 和 ,设:
- = 去掉第一个字符后,根据 的值可能需要对剩余字符取反
- = 去掉前两个字符后,根据前两个字符的值进行变换
那么:
$$f(S, k) = f(S_0, \lfloor k/2 \rfloor) + f(S_1, \lfloor (k-1)/2 \rfloor) $$其中 和 是根据 Thue-Morse 生成规则得到的子问题。
处理大
由于 可达 ,递归深度只有 ,但 的长度不超过 。
我们可以用记忆化搜索:
- 状态:
- 但 很大,实际上我们只需要记录 和递归深度
因为每次 会除以 2,所以最多 层递归。
算法框架(伪代码)
map<pair<string, ll>, int> memo; int solve(string S, ll k) { if (memo.count({S, k})) return memo[{S, k}]; int n = S.length(); // 边界情况 if (n == 0) return 1; // 空串可以任意扩展 if (k == 0) return check(S) ? 1 : 0; // 检查S本身是否合法 // 递归分解 int res = 0; // 情况1:匹配第一个字符 string S0 = transform(S, 1); // 根据Thue-Morse规则变换剩余字符串 if (S0 != "INVALID") { res += solve(S0, k / 2); } // 情况2:匹配前两个字符 if (n >= 2) { string S1 = transform(S, 2); // 根据前两个字符变换 if (S1 != "INVALID") { res += solve(S1, (k - 1) / 2); } } return memo[{S, k}] = res % MOD; }
复杂度分析
- 状态数:
- 每个状态处理时间:
- 总复杂度:,可以接受
总结
这道题的核心在于:
- 理解 Thue-Morse 序列的递归结构
- 将匹配问题分解为子问题:每次处理 1-2 个字符
- 利用记忆化搜索处理大 :递归深度只有对数级别
- 设计正确的状态转移:根据序列生成规则变换剩余字符串
通过这种分解,我们就能在 极大时高效求解。
- 1
信息
- ID
- 3631
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者