1 条题解
-
0
串联重复的兼容字符对
思路推导
先固定重复子串的半长 。其前后两半对应位置的字符必须能够变得相同。两个字符兼容,当且仅当它们已经相同,或者至少一个是问号。
一个长度为 的候选子串中,每个位置只属于一对对应字符,因此这些兼容条件彼此独立:只要所有 对字符都兼容,就能完成替换;如果有一对不同的已知字母,就不可能完成替换。
做法
枚举半长 ,从左到右检查所有相隔 的字符对。维护当前连续兼容的字符对数量,遇到不兼容的字符对时清零。一旦连续数量达到 ,就找到了长度为 的可行子串。
按半长从大到小枚举,可以在第一次找到可行子串时直接返回它的长度。若所有半长均不可行,答案就是 。
正确性证明
固定半长 ,任何长度为 、起点为 的子串,恰好对应比较序列中从 开始的 对字符。根据兼容条件,这个子串可行当且仅当这连续 对字符全部兼容。连续计数扫描恰好检测所有这样的区间,因此不会漏掉任何可行子串,也不会接受不可行子串。
算法按半长递减枚举。第一次找到的可行长度就是所有可行长度中的最大值;如果不存在任何可行长度,则正确输出 。
复杂度
对每个半长进行一次线性扫描,总时间为 ,其中 。除存储输入字符串外,额外空间为 。多组测试的总长度受题面约束限制。
部分分思路
极小规模可以枚举每个问号的替换,然后枚举所有偶长子串。只需枚举原字符串出现过的字母;原串没有已知字母时枚举字母
a即可。这不会漏掉最优值,因为每个待相等字符对要么受到某个已知字母约束,要么可以任选一个已有字母。枚举完成后的字符串再按字面检查,得到与兼容扫描独立的核验方式。中等规模可以枚举起点和半长,逐字符检查前后两半,直接得到 的做法。
若不含问号,可以对每个后缀计算 Z 函数:当该后缀的 时,其开头存在长度为 的串联重复。这一方案也是 时间,但使用精确相等与 Z 区间复用;问号兼容关系不具传递性,不能直接把 Z 函数的字符相等替换为兼容判断。满分扫描用固定距离上的连续兼容状态处理一般情形。
- 1
信息
- ID
- 1688
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者