1 条题解
-
0
「区间本质不同回文子串」题解
题意简化
给定字符串 ,多次询问区间 内本质不同回文子串的数量。 ,,可能强制在线。
核心算法:回文树 + 扫描线
1. 回文树
回文树(回文自动机)能 处理所有本质不同回文串:
- 每个节点代表一个本质不同回文串
- 节点数
2. 问题转化
对于每个回文串节点 (长度 ),设其在原串中的出现位置集合为 。
节点 对询问 有贡献当且仅当:
$$\exists i \in pos_p,\quad l \le i \le r - len_p + 1 $$即:至少有一个完整出现落在 内。
3. 离线算法()
将所有询问按右端点 排序,扫描右端点。
维护每个节点 的最后出现位置 。
当扫描到位置 时( 是当前右端点):
- 更新回文树,记录新出现的回文串
- 对于每个新出现的回文串节点 ,更新
对于询问 ,节点 有贡献当且仅当:
树状数组维护:
- 每个节点 在位置 上 +1
- 当 更新时,原位置 -1,新位置 +1
- 查询 :求 区间和
复杂度:
4. 在线算法()
需要可持久化数据结构。
主席树方法: 对每个右端点 建立版本:
- 版本 包含所有满足 的节点
- 节点 在位置 上标记
查询 :
- 在版本 上查询 区间内的标记数
- 即为答案
为什么正确: 节点 在版本 中被标记当且仅当:
- 它在位置 出现过
- 它的有效左端点
查询 时,我们只关心有效左端点 的节点。
算法步骤
预处理:
- 建立回文树
- 扫描字符串,记录每个节点的出现位置
- 建立主席树:对每个位置 ,更新涉及的回文串节点
查询:
- 根据 和 计算真正的
- 在主席树版本 上查询区间 的和
- 输出答案,更新
复杂度
- 回文树:
- 主席树: 空间, 查询
- 总复杂度:
关键点
1. 回文树更新
每次添加字符时,回文树会新增若干节点,需要及时更新这些节点的 值。
2. 有效左端点
节点 在位置 出现时,有效左端点为 。
3. 去重处理
同一节点可能多次出现,我们只关心最后一次出现(最近的 )。
4. 强制在线
需要异或处理,但算法本身支持在线查询。
样例解析
字符串:
abbabbba建立回文树后,节点及其出现位置:
a: 位置 1,4b: 位置 2,3,5,6,7,8bb: 位置 3-4,6-7,7-8bab: 位置 3-5- 等
查询 :
- 版本7包含所有有效左端点 ≤7 的节点
- 查询 得到7个节点
代码实现要点
- 回文树模板
- 主席树模板
- 扫描更新逻辑
- 在线解码逻辑
这种解法能处理 , 的数据。
- 1
信息
- ID
- 5993
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者