1 条题解
-
0
题意理解
我们有一棵有根树(根为 1),每条边上有一个字符
0或1。
定义 为从根到 路径上所有边的字符连接成的字符串。扩展点:如果 是 的后缀,则 是 的扩展点。
每个点 有:
- :价值
- :限制
过程:
- Alice 从 删除末尾 个字符,得到 (长度 从 到 )。
- Bob 收到 ,可以在末尾加字符得到 。
- 如果存在 的扩展点 使得:
- 则 Bob 获得 ,且 Bob 会选择 最大 的 。
- 对每个 得到最大收益,求和就是 。
形式化转化
对每个 ,求: $ ans_u = \sum_{i=0}^{|S_u|} \max_{\substack{i \ge a_v \\ S_u = S_v[|S_v|-|S_u|+1, |S_v|] \\ S_u[1, i] = S_v[1, i]}} val_v $ 其中 是 的扩展点集合。
关键观察
-
扩展点的含义
是 的扩展点 ⇔ 是 的后缀 ⇔ 在 后缀树/后缀自动机 上, 对应的节点是 对应节点的祖先(在反串的 suffix tree 中),但更简单的是:
在 Trie 上(所有 插入 Trie), 对应的节点是 对应节点的祖先(因为 是 的前缀?注意这里方向反了)。实际上 是 的后缀 ⇔ 在正串的 Trie 上, 是 的祖先?不,这是前缀关系。
后缀关系需要反转字符串:定义 ,那么 是 的后缀 ⇔ 是 的前缀。所以我们可以把每个 反转,插入 Trie,那么扩展点关系就是 Trie 上的 祖先-后代 关系。
-
条件
在反转串的 Trie 中, 对应 的前 个字符,也就是原串 的后 个字符反转。
但更简单理解: 是 Alice 删除后剩下的长度, 是 的前缀, 是 的前缀,要求它们相等。
在 Trie 上(正串),前缀相等意味着它们有公共祖先在深度 处。所以我们可以:
- 将所有 插入 Trie,每个节点对应一个前缀。
- 对每个 ,在 Trie 上从根到 的路径上(深度 从 0 到 ),我们考虑深度 的节点 ,我们要找 的扩展点 且 在 的子树中(因为 的前 个字符与 相同),且 ,且 是 的后缀。
但 是 的后缀 在 Trie 上怎么体现?
在正串 Trie 上, 是 的后缀 ⇔ 在 后缀树 上是 的祖先。
所以我们需要建立 后缀自动机 (SAM) 或 后缀树 来处理后缀关系。
后缀自动机解法
我们考虑将 所有 的反串 插入一个广义 SAM。
在 SAM 的 parent 树上,如果 对应的节点是 对应的节点的祖先,则 是 的后缀 ⇔ 是 的后缀。所以扩展点关系就是 parent 树上的祖先-后代关系。
问题转化到 SAM 的 parent 树上
对每个 ,在 SAM 上找到对应节点 (反串的结束节点)。
那么 的扩展点集合 = 在 parent 树中 的子树中的所有 。原问题:
对每个 ,对 ,求 $ \max_{\substack{v \in \text{subtree}(pos_u) \\ i \ge a_v \\ \text{lcp}(S_u, S_v) \ge i}} val_v $ 其中 是最长公共前缀长度。
进一步简化
注意 在 Trie 上(正串)意味着: 和 在深度 时有公共祖先。
但 的深度 固定, 是 的前缀长度,所以 必须和 共享前 个字符。在正串 Trie 上,从根到 的路径上深度 的节点 ,我们要找 在 的子树中,且 在 SAM 的 parent 树中在 的子树中,且 。
实现方案
-
建立所有 的 正串 Trie,记录每个节点对应的 集合(可能有多个 共享前缀)。
-
建立所有 反串的 广义 SAM,记录每个节点对应的 集合(可能有多个 对应同一个节点,如果它们反串后缀相同)。
-
在 SAM 的 parent 树上 DFS,得到每个节点的子树中所有 对。
-
对 Trie 上每个节点 (深度 ),它子树中所有 的扩展点 满足 的最大 可以预处理:
对每个深度 ,维护一个数据结构,支持:添加 ,查询所有 的最大 。
由于 从 0 到 ,我们可以用线段树按 存储最大值,查询前缀最大值。 -
对每个 ,在 Trie 上从根到 路径上每个深度 ,查询该深度节点对应的最大 ,然后求和。
算法步骤
- 读入,建树,得到每个 。
- 建正串 Trie,节点记录深度、对应哪些 的路径经过它。
- 建反串广义 SAM,记录每个节点对应哪些 的结束位置。
- 在 SAM parent 树上 DFS 合并子树信息( 集合)。
- 在 Trie 上 DFS,进入节点时把该节点在 SAM 中对应集合的 加入全局线段树(按 ),退出时撤销。
- 对每个 Trie 节点 (深度 ),记录 线段树查询 的最大值。
- 对每个 , = 从深度 0 到 的 之和。
复杂度
- Trie 和 SAM 节点数
- 线段树更新
- 总
- 1
信息
- ID
- 5698
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者