【HAOI2017】供给侧改革
问题描述
Anihc国提高社会生产力水平.落实好以人民为中心的发展思想。决定进行供给侧结构性改革。
为了提高供给品质.你调查了某个产业近来 $ n $ 个时期的供求关系平衡情况.每个时期的情况都用 $ 0 $ 或 $ 1 $ 中的一个数字来表示.于是这就是—个长度为 $ n $ 的 $ 01 $ 字符串 $S$ 。为了更好的了解这一些数据.你需要解决一些询问.我们令 $ data(l,r) $ 表示:在字符串 $S$ 中.起始位置在$ [l,r] $之间的这些后缀之中,具有最长公共前缀的两个后缀的最长公共前缀的长度。
对于每一个询问 $ L $ , $ R $ .求
$ ans = \sum\limits_{ L \le i \lt R } data(i, R) $
由于你其实根本没有时间调查,所以这些数据都是乱编的,即串S中的每一位都是在 $ 0 $ 和 $ 1 $ 之间随机产生的。
输入格式
第一行 $ 2 $ 个整数 $ n $ , $ Q $,表示字符串的长度,以及询问个数
接下来一行长度为 $n$ 的一个 $01$ 串 $S$
接下来 $Q$ 行,每行 $2$ 个整数 $L,R$ .一个询问 $L.R$
输出格式
共 $Q$ 行.每行一个整数.表示对应询问的答案。
样例输入
6 3
010110
2 5
1 6
1 2
样例输出
4
6
0
提示
对于所有的数据保证:$ n <= 100000 $ , $ Q<= 100000 $ , $ 1<=L<R<=n $ , $01$ 串随机生成。
这题有一个强限制,$01$串随机生成。因此我们大胆猜测$LCP$的长度不会太大,估测个40差不多了。
那么可以怎么做的,我们考虑对询问按右端点排序,那么从左往右处理询问,每次将以当前右端点前的位置为开头的后缀加到trie里面去,只用加每个后缀的前40位,然后记录一个数组$Max[i]$表示长度为$i$的$LCP$的最后出现位置时一个长度为$i$的后缀倒数第二次出现的位置,这个可以在$trie$上记录每个串上次出现的位置,然后再访问到的时候就可以用上次的位置来更新$Max$
然后对每个询问,枚举$Max[i]$,如果$Max[i]>=l$,那么就存在长度为$i$的$LCP$在范围内。
复杂度$O(q\log q+40n)$
代码:
1 |
|