#CPP2F. 标签改名

标签改名

题意:

最初没有卡片。每张卡片带有一个小写字母标签,同名卡片可以有多张。

依次处理以下操作:

  • ADD s:增加一张标签为 ss 的卡片。
  • MOVE a b:将当前所有标签为 aa 的卡片同时改名为 bb。原本标签为 bb 的卡片保留,因此两部分数量相加。若没有标签为 aa 的卡片,或 a=ba=b,则不发生变化。
  • COUNT s:输出当前标签为 ss 的卡片数量。没有这种卡片时输出 00,询问不会增加卡片。

改名只影响执行该次操作时已经存在的卡片。之后仍然可以新建标签为 aa 的卡片,它不会自动改为 bb。

处理完全部操作后,按标签的字典序输出所有仍有卡片的标签及其数量。

字典序比较从左到右找到第一个不同字母,字母靠前者较小;一方是另一方的完整前缀时,较短者较小。

输入格式:

第一行一个整数 qq(1≤q≤2×1051 \le q \le 2\times10^5),表示操作次数。

接下来 qq 行,每行给出一条上述操作:

  • ADD、COUNT 操作给出字符串 ss(1≤∣s∣≤121 \le |s| \le 12)。
  • MOVE 操作给出字符串 aa、bb(1≤∣a∣,∣b∣≤121 \le |a|,|b| \le 12)。

所有标签仅由小写英文字母组成。

输出格式:

先按操作顺序,对每条 COUNT 操作输出一行数量。

随后输出一行,表示最终仍有卡片的不同标签数量 cc。接下来 cc 行,按标签字典序输出标签和卡片数量,以一个空格分隔。

最终没有卡片时,这一部分只输出一行 00。

样例:

样例输入1:

10
ADD red
ADD blue
ADD red
MOVE red blue
COUNT red
COUNT blue
MOVE blue blue
ADD red
MOVE none red
COUNT red

样例输出1:

0
3
1
2
blue 3
red 1

样例解释1:

第一次改名后,三张卡片的标签均为 blue。后续新增的 red 卡片仍使用 red 标签。把 blue 改为 blue 不会翻倍数量,也不会删除卡片。

样例输入2:

3
COUNT x
MOVE x y
COUNT y

样例输出2:

0
0
0