1 条题解
-
0
题解
思路
对单词 ,用 表示删除位置 ,用 表示不删除。每个单词恰有 个带位置编号的候选项;即使两个候选字符串相同,也必须分别计数。
子任务 1 枚举所有单词的候选项笛卡尔积,逐一检查整个序列。
子任务 2 设 为前 个单词合法且第 个单词选择 的方案数。枚举相邻两行的候选对,只要前一个候选串不大于当前候选串就转移。
子任务 3 先显式构造每个单词的全部候选串并稳定排序。相邻两行都已排序后,用双指针维护前一行不大于当前候选串的 DP 前缀和,每个候选只进入前缀和一次。
满分算法不显式构造候选串。对于同一个原串的所有“删一位”结果,可以按连续相同字符段和删除位置在线性时间内得到字典序顺序;不删除的候选插在删除末位的候选之后。相邻两行仍使用双指针 DP。
比较两个带一个删除位置的候选串时,用双模滚动哈希计算任意候选前缀的哈希值。二分最长公共前缀后,只需比较第一个不同字符或候选长度,一次比较为 。
做法
- 为每个原串预处理双模前缀哈希和删除候选的字典序顺序。
- 第一行每个候选的方案数均为 。
- 从第二行开始,按当前候选的字典序扫描。
- 双指针加入前一行所有不大于当前候选的状态,并维护方案数前缀和。
- 最后一行全部状态求和并对 取模。
复杂度
设所有单词总长度为 ,最大单词长度为 。
子任务 1 的时间复杂度与 成正比,空间复杂度为 。
子任务 2 的时间复杂度为 ,空间复杂度为 。
子任务 3 的时间复杂度为 ,空间复杂度为 。
满分算法的时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1240
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者