题意
给出串 S S S, K 1 , K 2 K1,K2 K1,K2,求
∑ 1 ≤ i < j ≤ n L C P ( i , j ) ⋅ L C S ( i , j ) ⋅ [ L C P ( i , j ) ≤ K 1 ] ⋅ [ L C S ( i , j ) ≤ K 2 ] \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]
题解
不是很懂边分树怎么维护信息的。。。只会边分。
首先对原串 S S S和反串 S ′ S' S′建立SAM,然后取出两棵 p a r e n t parent parent树,然后在 S S S的SAM中找到每个前缀点,以及 S ′ S' S′的SAM中的每个后缀点,分别标号为 1.. i 1..i 1..i。
则求的东西就是
∑ 1 ≤ i < j ≤ n l e n [ L C A ( i , j ) ] ⋅ l e n ′ [ L C A ′ ( i , j ) ] ⋅ [ l e n [ L C A ( i , j ) ] ≤ K 2 ] ⋅ [ l e n ′ [ L C A ′ ( i , j ) ] ≤ K 1 ] \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]
目前为止看起来还是很烦,我们继续处理一下,将 p a r e n t parent parent树看成一个有根有边权(可以负)的树,将每个点的 l e n len len( l e n ′ len' len′)视作是他到根的距离。然后将 S S S的 p a r e n t parent parent树中 l e n > K 2 len > K2 len>K2点的 l e n len len置为0,同理将 S ′ S' S′的 p a r e n t parent parent树中 l e n > K 1 len > K1 len>K1点的 l e n ′ len' len′置为0。之后便可以认为是一棵有边权的树,根据 d e p dep dep来确定每条边的长度。
则求的就是所有点对 在两个数中的LCA的深度之积 的和。即
∑ 1 ≤ i < j ≤ n d e p [ L C A ( i , j ) ] ⋅ d e p ′ [ L C A ′ ( i , j ) ] \sum_{1 \le i < j \le n}{dep[LCA(i,j)]\cdot dep'[LCA'(i,j)]}