1 条题解
-
0
题目简析
给定字符串 ,要求构造一个字符串序列 ,满足:
- 是 的子串
- ,(长度递增 )
- ,存在 的长度为 的子串 ,使得 的前缀为 ,后缀为
求最大的 。
算法标签
- 字符串
- 后缀自动机
- 动态规划
- 图论建模
- 最长路径问题
核心条件分析
条件 是本题的关键。考虑 ,那么:
- 必须是 的前缀(因为长度差 )
- 存在一个比 长 的串 ,以 开头,以 结尾
这意味着 比 多一个字符 ,即 ,并且 必须出现在 的某个长度为 的子串的末尾位置。
问题转化
我们可以将问题建模为在 的所有子串上寻找最长链:
- 节点: 的所有子串(包括空串)
- 边:从 到 有边当且仅当:
- ( 为某字符)
- 存在 中一个长度为 的子串,以 为前缀,以 为后缀
那么问题转化为从空串 出发的最长路径长度。
高效解法
直接枚举所有子串不可行。我们需要利用字符串高级数据结构。
关键观察:条件等价于在 中, 和 必须出现在某个长度为 的窗口中,且 是前缀, 是后缀。这提示我们可以用后缀自动机(Suffix Automaton)来刻画所有子串的出现关系。
在后缀自动机中:
- 每个状态对应一组 endpos 集合相同的子串
- 状态之间的转移对应在子串末尾添加字符
- 从初始状态到某个状态的路径对应一个子串
我们定义 为从状态 出发的最长链长度。转移为:
其中 表示存在字符 使得从状态 经 转移到状态 。
最终答案为 。
算法流程
- 构建 的后缀自动机
- 按状态 从大到小排序(拓扑序)
- 动态规划计算
- 输出最大值
时间复杂度
- 预处理: 构建后缀自动机
- 动态规划: 状态转移
- 总复杂度:,适用于 的数据范围
样例验证
以 为例:
- 空串 (通过 )
- (通过 )
- (通过 )
链长为 ,与样例输出一致。
总结
本题通过将子串关系转化为后缀自动机中的状态转移,利用动态规划在线性时间内求解。核心在于理解条件 的本质是要求相邻子串在某个公共窗口中以特定位置关系出现,这恰好对应自动机中的字符转移关系。
- 1
信息
- ID
- 3121
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者