BZOJ 4259 残缺的字符串

题目大意

给出两个字符串 A A A B B B,长度分别为 n n n m m m,其中包含 ′ ∗ ′ '*' 字符,它可以匹配任意 1个 字符,求 A A A 串在 B B B 串中的出现次数。
数据范围  1 ⩽ m ⩽ n ⩽ 300000 1\leqslant m\leqslant n\leqslant 300000 1mn300000

题解

为了方便叙述,定义 S i . . j S_{i..j} Si..j 表示由S的第 i i i 个字符开始到第 j j j 个字符组成的字符串。
′ ∗ ′ = 0 '*' =0 =0,定义两个字符串之间的距离为:
d i s ( S , T ) = ∑ ( S i − T i ) 2 S i T i dis(S,T)=\sum (S_i-T_i)^2S_iT_i dis(S,T)=(SiTi)2SiTi
可以发现,当且仅当 d i s ( S , T ) = 0 dis(S,T)=0 dis(S,T)=0 时, S S S T T T 匹配。
接下来暴力一些,定义 f [ i ] = d i s ( A 0.. ( m − 1 ) , B ( i − m + 1 ) . . i ) f[i]=dis(A_{0..(m-1)},B_{(i-m+1)..i}) f[i]=dis(A0..(m1),B(im+1)..i),如果我们求出了 f f f 数组,那问题就变成了 f f f 数组中有多少个 0 0 0
f [ i ] = ∑ j = 0 m − 1 ( A [ j ] − B [ i − m + 1 + j ] ) 2 A [ j ] B [ i − m + 1 + j ] f[i]=\sum_{j=0}^{m-1}\limits(A[j]-B[i-m+1+j])^2A[j]B[i-m+1+j] f[i]=j=0m1(A[j]B[im+1+j])2A[j]B[im+1+j]
将A串翻转,得:
f [ i ] = ∑ j = 0 m − 1 ( A [ m − j − 1 ] − B [ i − m + 1 + j ] ) 2 A [ m − j − 1 ] B [ i − m + 1 + j ] f[i]=\sum_{j=0}^{m-1}\limits(A[m-j-1]-B[i-m+1+j])^2A[m-j-1]B[i-m+1+j] f[i]=j=0m1(A[mj1]B[im+1+j])2A[mj1]B[im+1+j]
拆开得到:
f [ i ] =   ∑ j = 0 m − 1 A [ m − j − 1 ] 3 B [ i − m + 1 + j ] − 2 ∗ ∑ j = 0 m − 1 A [ m − j − 1 ] 2 B [ i − m + 1 + j ] 2 + ∑ j = 0 m − 1 B [ i − m + 1 + j ] 3 ∗ A [ m − j − 1 ] f[i]=\quad\ \sum_{j=0}^{m-1}\limits A[m-j-1]^3B[i-m+1+j]\\ \quad\qquad-2*\sum_{j=0}^{m-1}\limits A[m-j-1]^2B[i-m+1+j]^2\\ \quad\qquad+\sum_{j=0}^{m-1}\limits B[i-m+1+j]^3*A[m-j-1] f[i]= j=0m1A[mj1]3B[im+1+j]2j=0m1A[mj1]2B[im+1+j]2+j=0m1B[im+1+j]3A[mj1]
定义
f a [ i ] = ∑ j = 0 m − 1 A [ m − j − 1 ] 3 B [ i − m + 1 + j ] fa[i]=\sum_{j=0}^{m-1}\limits A[m-j-1]^3B[i-m+1+j] fa[i]=j=0m1A[mj1]3B[im+1+j]

f b [ i ] = ∑ j = 0 m − 1 A [ m − j − 1 ] 2 B [ i − m + 1 + j ] 2 fb[i]=\sum_{j=0}^{m-1}\limits A[m-j-1]^2B[i-m+1+j]^2 fb[i]=j=0m1A[mj1]2B[im+1+j]2

f c [ i ] = ∑ j = 0 m − 1 A [ m − j − 1 ] B [ i − m + 1 + j ] 3 fc[i]=\sum_{j=0}^{m-1}\limits A[m-j-1]B[i-m+1+j]^3 fc[i]=j=0m1A[mj1]B[im+1+j]3
则: f [ i ] = f a [ i ] + 2 ∗ f b [ i ] + f c [ i ] f[i]=fa[i]+2*fb[i]+fc[i] f[i]=fa[i]+2fb[i]+fc[i]
然后 f a fa fa f b fb fb f c fc fc 用FFT计算即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值