CF1073G 题解

题意

传送门

给定一个字符串,每次询问的时候给出两个集合 \(A\)\(B\),求

\[\sum_{i \in A}\sum_{j \in B} lcp(i,j) \]

\(1 \le n,q,\sum |A|,\sum |B| \le 2 \times 10^5\)

题解

\(SAM\) 建出字符串的后缀树,则 \(lcp(i,j)=dep(lca(i,j))\)

但要求的是两个集合间每对元素的价值之和,无法直接 \(O(n^2)\) 暴力求。怎么办呢?

一种常见的套路是,对于 \(A\) 中每个元素 \(x\),将 \(x\) 到根路径上的所有节点加 \(1\)。对于 \(B\) 中的每个元素 \(y\),答案加上 \(y\) 到根路径上节点的权值和。稍加思考易知其正确性。

还有一个问题是,\(SAM\) 建的后缀树有很多压缩的节点(在 \(parent\) 树上体现是边),我们无法统计这些节点的权值。但因为这些节点不会作为 \(lca\),所以我们可以将它们的权值并到其下面第一个节点一起计算。

于是我们要实现给一条链上所有边加一个值,以及查询一条链上权值和。可以用 \(LCT\) \(O(n \log n)\) 实现。

posted @ 2022-10-21 11:05  realFish  阅读(39)  评论(0)    收藏  举报