#CF710F. String Set Queries

String Set Queries

String Set Queries

  • 时间限制:3 秒
  • 内存限制:512 MiB

题目描述

你需要对一个字符串集合 DD 处理 mm 个查询。每个查询有三种类型之一:

  1. 向集合 DD 中添加一个字符串 ss。保证字符串 ss 之前没有被添加过。
  2. 从集合 DD 中删除一个字符串 ss。保证字符串 ss 当前在集合 DD 中。
  3. 给定字符串 ss,求集合 DD 中所有字符串在 ss 中出现的次数总和。如果集合 DD 中的某个字符串 ppss 中出现了多次,则应计入所有出现次数。

请注意,你需要以在线模式(online)解决此问题。这意味着你不能一次读取所有输入。你只能在输出上一个三类查询的答案后读取下一个查询。在你的程序中,你需要在每次输出后调用 C++ 的 fflush 或 Java 的 BufferedWriter.flush 函数。

输入格式

第一行包含一个整数 mm1m31051 \leq m \leq 3 \cdot 10^{5}),表示查询的数量。

接下来的 mm 行,每行包含一个整数 tt1t31\leq t \leq 3)和一个非空字符串 ss,表示查询的类型以及需要处理的字符串。所有字符串仅包含小写英文字母。

输入中所有字符串总长度不超过 31053 \cdot 10^{5}

输出格式

对于每个三类查询,输出一个整数 cc,表示集合 DD 中所有字符串在 ss 中出现的次数之和。

样例输入 1

5
1 abc
3 abcabc
2 abc
1 aba
3 abababc

样例输出 1

2
2

样例输入 2

10
1 abc
1 bcd
1 abcd
3 abcd
2 abcd
3 abcd
2 bcd
3 abcd
2 abc
3 abcd

样例输出 2

3
2
1
0

数据范围

  • 1m31051 \le m \le 3\cdot 10^5
  • 所有操作中的字符串均非空且只含小写英文字母。
  • 所有操作字符串的总长度不超过 31053\cdot 10^5
  • 第一类操作保证字符串当前不在集合中;第二类操作保证字符串当前在集合中。