1 条题解
-
0
题解
思路
原条件可以从两端向中间理解:每次选一个长度 ,要求当前剩余串的长度为 的前缀与后缀完全相同,然后同时删去它们。每次删除对应最终分割中的一对子串。
做法
子任务 1:直接比较
设 表示已经从左右两端各删去 个字符的方案数。枚举下一对的长度 ,直接逐字符比较
相等时令 。复杂度为 。
子任务 2:转化为偶回文分割
构造新串
考虑从两端各取长度 的两个块。它们相等,当且仅当 中对应的长度 的连续段是回文串。因此原问题等价于:把 分割成若干偶数长度的回文串。
设 表示 的前 个字符的方案数。枚举所有回文区间 ,当 和 都是偶数时执行
用区间动态规划判断回文性,复杂度为 ,空间复杂度为 。
子任务 3:回文树与等差链
扫描 并建立回文树。每个节点表示一种回文串,失配指针指向它的最长真回文后缀。对节点 定义
$$\mathrm{diff}_v=\mathrm{len}_v-\mathrm{len}_{\mathrm{link}_v}.$$若 与失配节点的
diff相同,则它们属于同一条长度等差链;否则开启一条新链。seriesLink直接跳到上一条链,所以每个位置只需枚举等差链,而不用枚举全部回文后缀。对当前前缀长度 ,维护一条链对 的贡献
$$\mathrm{aux}_v=f_{i-(\mathrm{len}_{\mathrm{seriesLink}_v}+\mathrm{diff}_v)} +[\mathrm{diff}_v=\mathrm{diff}_{\mathrm{link}_v}]\,\mathrm{aux}_{\mathrm{link}_v}.$$aux:只有 为偶数时才把这些贡献加入 ,但奇数位置仍需刷新
aux,供下一位置的同差链使用。初值为 ,答案为 。该等差链优化的总复杂度为 ,实际回文树构建和链跳转在线完成;空间复杂度为 。
复杂度
三个层级分别为 、 和 ;满分算法空间复杂度为 。
正确性
构造串中任意偶数长度回文段的第 个字符来自左侧块,第 个字符来自右侧块中同一相对位置,所以回文条件与两块相等完全等价。每次选块对与每个偶回文段一一对应,故两种分割方案双射。回文树枚举当前所有回文后缀,等差链只合并相同
diff的连续后缀,不改变贡献之和,因此动态规划恰好计数全部合法分割。
- 1
信息
- ID
- 1503
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者