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

题意

给出串SSSK1,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]}1i<jnLCP(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]} 1i<jnlen[LCA(i,j)]len[LCA(i,j)][len[LCA(i,j)]K2][len[LCA(i,j)]K1]
目前为止看起来还是很烦,我们继续处理一下,将parentparentparent树看成一个有根有边权(可以负)的树,将每个点的lenlenlen(len′len'len)视作是他到根的距离。然后将SSSparentparentparent树中len>K2len > K2len>K2点的lenlenlen置为0,同理将S′S'Sparentparentparent树中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)]} 1i<jndep[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值