Problem
一旦康斯坦丁参加了下一次,已经是第 13 届国际奥林匹克运动会,就乘火车回家了。他一如既往地坐下来思考生命的意义,同时解决编程问题。一段时间后,康斯坦丁打瞌睡了,但麻烦的是,要想醒来,他必须解决脑中冒出来的、一直困扰着他的问题!
这一次,康斯坦丁梦见了一棵最初只有一个编号为1的顶点的树。在他设置的问题中,新的顶点逐渐添加到树中。在第i秒,一个编号为i+1的顶点被添加到树中,它作为顶点p
i的儿子被挂起,并且在顶点i+1之间的边上和 p
i 字母 c
i 被写了。
从树的根到顶点v的每条路径都对应一个特定的字符串,该字符串是按照从根到顶点v的顺序写出当前路径的边上所写的符号得到的。乍一看,康斯坦丁面临着一项艰巨的任务——每次添加一个新顶点后,计算从树根(顶点编号 1)开始到其他某个顶点结束的唯一字符串的数量。
在他的梦中,康斯坦丁根本不是天才,所以他自己无法解决这个问题。帮助康斯坦丁解决问题并醒来。
输入:
第一行包含数字 n - 向树添加新节点的请求数 (1 <= n <= 300000)。
接下来的 n 行描述了添加顶点的请求。第 i 个查询由参数 p
i (1 <= p
i <= i) 和 c
i 描述,其中意味着添加编号为 i+1 的顶点作为子节点挂在编号为 p
i 的顶点上,并且符号 c
i 写在结果边上 -拉丁字母的小写字母。
输出:
打印 n 行。在第 i 行打印添加第 i+1 个顶点后 Konstantin 问题的答案。
示例:
<正文>
输入 |
输出 |
2
1 乙
2p |
1
2 |
3
1个
1个
2j |
1
1
2 |
表>