【模板】后缀平衡树

题目背景

"后缀平衡树"这个名字正确性存疑,由于 clj 给的"重量平衡树"定义有歧义。 字符串我也不会,所以也没去查证。

题目描述

给你一个字符串 `init`,要求你支持三个操作: 1. 在当前字符串的后面插入若干个字符。 2. 在当前字符串的后面删除若干个字符。 3. 询问字符串 $s$ 在当前字符串中出现了几次(作为连续子串)? 你必须在线支持这些操作。

输入输出格式

输入格式


第一行一个数 $q$ 表示操作个数。 第二行一个字符串表示初始字符串 `init`。 接下来 $q$ 行,每行 $2$ 个字符串 `Type Str`。 Type是 `ADD` 的话表示在后面插入。 Type是 `DEL` 的话表示在后面删除。 Type是 `QUERY` 的话表示询问某字符串在当前字符串中出现了几次。 为了体现在线操作,你需要维护一个变量 `mask`,初始值为 $0$。 读入串 `Str` 之后,使用这个过程将之解码成真正询问的串 `TrueStr`。 询问的时候,对 `TrueStr` 询问后输出一行答案 `Result`。 然后 `mask = mask xor Result` 插入的时候,将 `TrueStr` 插到当前字符串后面即可。 ![](https://cdn.luogu.com.cn/upload/image_hosting/whqt9ff9.png)

输出格式


对每个 $3$ 操作,输出一行一个整数表示答案。

输入输出样例

输入样例 #1

3
A
QUERY B
ADD BBABBBBAAB
DEL 1

输出样例 #1

0

说明

数据字符串变化长度以及初始长度和 $ \le 8 \times 10^5$,询问次数 $\le 10^5$,询问总长度 $\le 3 \times 10^6$。 字符集为大写字母,注意 `ADD` 和 `QUERY` 操作的字符串都需要解压。