洛谷P1117 [NOI2016]优秀的拆分(巧妙的计数方法)

文章目录

题目

[NOI2016]优秀的拆分

分析

统计以 S i S_i Si开头的形如 AA \text{AA} AA的子串的数量,存入 L [ i ] L[i] L[i];统计以 S i S_i Si结尾的形如 AA \text{AA} AA的子串,存入 R [ i ] R[i] R[i]。于是把可以把它们拼起来,答案就是 ∑ i = 2 n ( L [ i ] × R [ i − 1 ] ) \sum \limits_{i = 2}^{n} (L[i] \times R[i - 1]) i=2n(L[i]×R[i1])
L L L R R R数组的处理,暴力枚举+哈希判断相等是 O ( n 2 ) O(n^2) O(n2)的,考虑优化这个东西。

我们枚举 A \text{A} A的长度 l l l,那么一个 A \text{A} A S S S中会经过且仅经过一个 S k ⋅ l S_{k \cdot l} Skl,如图所示,蓝点是 S k ⋅ l S_{k \cdot l} Skl,可见任何一个长度为 l l l的子串必然经过一个蓝点。
图一
那么我们把这个串看成左右两端,即以 S k ⋅ l S_{k \cdot l} Skl开始的后缀(下图中橙色示意的范围)和以 S k ⋅ l S_{k \cdot l} S

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值