bzoj 1921: [Ctsc2010]珠宝商 后缀自动机+点分治

题意

有一棵n个节点的树和一个长度为m的字符串S,树上每个节点有一个字符。问对于任意的有序数对(x,y),从x到y路径组成的字符串在S中出现次数的和。
n,m<=50000 n , m <= 50000

分析

因为是求出现次数,显然可以用到后缀自动机来做。
首先考虑两种不同的暴力做法:

暴力1:枚举每个点作为起点,然后把整棵树dfs一次,求出起点到每个点组成的路径的出现次数。由于sam的转移是 O(1) O ( 1 ) 的,所以这么做总的复杂度是 O(n2) O ( n 2 )

暴力2:我们考虑求每个点作为路径的lca时候的贡献。设路径的lca为点Z,那么对于一条路径(X,Y),我们可以将其拆成(X,Z)和(Z,Y)两条路径。对于Z的字符在S中的匹配位置,我们可以求出有多少条形如(Z,Y)的路径在该位置匹配;同理我们可以求出有多少条形如(X,Z)的路径在S的反串对应位置上匹配,然后每一位两边的匹配数相乘的和就是这个点的贡献。但注意到有可能X和Y位于同一棵子树内,所以还要对每棵子树再求一次来去重。关于如何实现求每个位置的匹配路径数量,我们可以在正反两串的后缀树上打标记,最后下推到叶节点就好了。这么做因为求每个点贡献的时候都要把后缀树扫一遍,所以总的复杂度是 O(n2+nm) O ( n 2 + n m )

再仔细思考一下不难发现暴力2可以通过点分治来优化。因为点分治后,所有分治子树的size和大小为

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值