题意
给出串SSS,K1,K2K1,K2K1,K2,求
∑1≤i<j≤nLCP(i,j)⋅LCS(i,j)⋅[LCP(i,j)≤K1]⋅[LCS(i,j)≤K2]\sum_{1 \le i < j \le n}{LCP(i,j) \cdot LCS(i,j) \cdot [LCP(i,j) \le K1] \cdot [LCS(i,j) \le K2]}1≤i<j≤n∑LCP(i,j)⋅LCS(i,j)⋅[LCP(i,j)≤K1]⋅[LCS(i,j)≤K2]
题解
不是很懂边分树怎么维护信息的。。。只会边分。
首先对原串SSS和反串S′S'S′建立SAM,然后取出两棵parentparentparent树,然后在SSS的SAM中找到每个前缀点,以及S′S'S′的SAM中的每个后缀点,分别标号为1..i1..i1..i。
则求的东西就是
∑1≤i<j≤nlen[LCA(i,j)]⋅len′[LCA′(i,j)]⋅[len[LCA(i,j)]≤K2]⋅[len′[LCA′(i,j)]≤K1] \sum_{1 \le i < j \le n}{len[LCA(i,j)] \cdot len'[LCA'(i,j)] \cdot [len[LCA(i,j)] \le K2] \cdot [len'[LCA'(i,j)]\le K1]} 1≤i<j≤n∑len[LCA(i,j)]⋅len′[LCA′(i,j)]⋅[len[LCA(i,j)]≤K2]⋅[len′[LCA′(i,j)]≤K1]
目前为止看起来还是很烦,我们继续处理一下,将parentparentparent树看成一个有根有边权(可以负)的树,将每个点的lenlenlen(len′len'len′)视作是他到根的距离。然后将SSS的parentparentparent树中len>K2len > K2len>K2点的lenlenlen置为0,同理将S′S'S′的parentparentparent树中len>K1len > K1len>K1点的len′len'len′置为0。之后便可以认为是一棵有边权的树,根据depdepdep来确定每条边的长度。
则求的就是所有点对 在两个数中的LCA的深度之积 的和。即
∑1≤i<j≤ndep[LCA(i,j)]⋅dep′[LCA′(i,j)] \sum_{1 \le i < j \le n}{dep[LCA(i,j)]\cdot dep'[LCA'(i,j)]} 1≤i<j≤n∑dep[LCA(i,j)]⋅dep′[LCA′(i,j)]
到这里就是边分的套路了,可以O(nlogn)O(nlogn)O(nlogn)或者O(nlog2n)O(nlog^2n)O(nlog2n)求解。
具体做法是:
先将某一个LCA化简掉,这里化简掉第一个LCA,即原式等价于
∑1≤i<j≤n12⋅(dep[i]+dep[j]−dis(i,j))⋅dep′[LCA′(i,j)] \sum_{1 \le i < j \le n}{\frac{1}{2}\cdot (dep[i] + dep[j] - dis(i,j)) \cdot dep'[LCA'(i,j)]} 1