CF207C3 Game with Two Trees
题目描述
ABBYY 的聪明海狸发明了一款新的儿童益智游戏。海狸认为这款游戏能帮助孩子们更好地理解编程。
游戏的主要对象是有限有根树,每条边上都标有一个小写英文字母。每棵树的顶点总是从 $1$ 到 $m$ 顺序编号,其中 $m$ 是树中顶点的数量。在介绍实际游戏之前,先给出一些定义。
我们认为,顶点序列 $v_{1}$、$v_{2}$、$\ldots$、$v_{k}$($k \geq 1$)是一个“正向路径”,如果对于任意整数 $i$,$1 \leq i < k$,顶点 $v_{i}$ 是顶点 $v_{i+1}$ 的直接祖先。如果我们依次写出该路径上从 $v_{1}$ 到 $v_{k}$ 的所有边上的字母,就得到一个字符串($k=1$ 时为空串)。我们称这个字符串为该正向路径 $v_{1}$、$v_{2}$、$\ldots$、$v_{k}$ 所对应的字符串。
我们认为,顶点序列 $v_{1}$、$v_{2}$、$\ldots$、$v_{k}$($k \geq 1$)是一个“反向路径”,如果对于任意整数 $i$,$1 \leq i < k$,顶点 $v_{i}$ 是顶点 $v_{i+1}$ 的直接子节点。如果我们依次写出该路径上从 $v_{1}$ 到 $v_{k}$ 的所有边上的字母,就得到一个字符串($k=1$ 时为空串)。我们称这个字符串为该反向路径 $v_{1}$、$v_{2}$、$\ldots$、$v_{k}$ 所对应的字符串。
现在介绍 ABBYY 的聪明海狸设计的游戏。游戏中有两棵有根树,每棵树初始时都只有编号为 $1$ 的一个顶点。玩家会得到一系列操作。每个操作由三个值 $(t, v, c)$ 描述,其中:
- $t$ 表示进行操作的树的编号($1$ 或 $2$);
- $v$ 表示该树中的顶点编号(保证该树中存在编号为 $v$ 的顶点);
- $c$ 是一个小写英文字母。
具体操作如下:在树 $t$ 的顶点 $v$ 下添加一个新的子节点,编号为 $m+1$($m$ 是当前树 $t$ 的顶点数),并在从 $v$ 到 $m+1$ 的新边上标记字母 $c$。
我们称有序三元组 $(i, j, q)$ 为一个“好组合”,如果满足:
- $1 \leq i \leq m_{1}$,其中 $m_{1}$ 是第一棵树的顶点数;
- $1 \leq j, q \leq m_{2}$,其中 $m_{2}$ 是第二棵树的顶点数;
- 在第二棵树中,存在一个正向路径 $v_{1}, v_{2}, \ldots, v_{k}$,使得 $v_{1}=j$,$v_{k}=q$;
- 第二棵树中从顶点 $j$ 到 $q$ 的正向路径所对应的字符串,等于第一棵树中从顶点 $i$ 到 $1$ 的反向路径所对应的字符串(注意这两条路径都是唯一确定的)。
你的任务是,在每次操作后,计算当前存在的好组合的数量。
输入格式
第一行包含一个整数 $n$,表示对树进行的操作数。接下来的 $n$ 行按顺序给出每次操作。每行格式为“$t$ $v$ $c$”,其中 $t$ 是树的编号,$v$ 是该树中的顶点编号,$c$ 是一个小写英文字母。
对于第一组测试数据,$1 \leq n \leq 700$。
对于第二组测试数据,$1 \leq n \leq 7000$。
对于第三组测试数据,$1 \leq n \leq 100000$。
输出格式
输出恰好 $n$ 行,每行一个整数,表示在对应操作后存在的好组合数量。
请不要在 C++ 中使用 %lld 读取或输出 64 位整数。推荐使用 cin、cout 流或 %I64d 格式。
说明/提示
第一次操作后,唯一的好组合是 $(1,1,1)$。第二次操作后出现了新的好组合,$(2,1,2)$ 和 $(1,2,2)$。第三次操作没有带来新的好组合。第四次操作增加了好组合 $(1,3,3)$。最后,第五次操作带来了多达三个新好组合——$(1,4,4)$、$(2,3,4)$ 和 $(3,1,4)$。
由 ChatGPT 4.1 翻译