SubString

题目描述

给定一个字符串 `init`,要求支持两个操作: - 在当前字符串的后面插入一个字符串。 - 询问字符串 $s$ 在当前字符串中出现了几次。(作为连续子串) 强制在线。

输入输出格式

输入格式


第一行一个整数 $Q$ 表示操作个数。 第二行一个字符串表示初始字符串 `init`。 接下来 $Q$ 行,每行 $2$ 个字符串 `Type`,`Str`。 - `Type` 是 `ADD`,表示在后面插入字符串。 - `Type` 是 `QUERY`,表示询问某字符串在当前字符串中出现了几次。 为了体现在线操作,你需要维护一个变量 `mask`,初始值为 $0$。 ```cpp String decodeWithMask(String s, int mask) { char[] chars = s.toCharArray(); for (int j = 0; j < chars.length; j++) { mask = (mask * 131 + j) % chars.length; char t = chars[j]; chars[j] = chars[mask]; chars[mask] = t; } return new String(chars); } ``` 读入串 `Str` 之后,使用这个过程将之解码成真正询问的串 `TrueStr`。 询问的时候,对 `TrueStr` 询问后输出一行答案 `Result`。 然后 $mask=mask \bigoplus Result$。 插入的时候,将`TrueStr`插到当前字符串后面即可。 **注意:`ADD` 和 `QUERY` 操作的字符串都需要解压。**

输出格式


对于每一个 `QUERY` 操作,输出询问的字符串在当前字符串中出现了几次。

输入输出样例

输入样例 #1

2
A
QUERY B
ADD BBABBBBAAB

输出样例 #1

0

说明

$|\mathrm{init}| \leq 6 \times 10^5$,$Q \leq 6\times 10^5$,询问总长度 $\leq 3 \times 10^6$。 保证字符串中只会出现 `A` 和 `B`。 为防止评测过慢,对于测试点 $2,3,5,6,8,11$ 时限为 3s,其余为 1s。 原题:BZOJ 2555