洛谷P5115 : SAM + 边分治 + 虚树dp

题意

给出串 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]} 1i<jnLCP(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]} 1i<jnlen[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)]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值