#3447. 子树回文(tree)
子树回文(tree)
题目描述
小 P 有一棵以数组方式存储的二叉树,共 个节点,编号 ,其中 号节点为根。对于节点 ,若 则其左儿子为节点 ,若 则其右儿子为节点 。每个节点上写有一个小写字母。
称一个节点为回文节点,当且仅当该节点子树中所有节点上的字母能够重新排列成一个回文串。例如,字母集合 可以排列成 aba,是回文串;而 无论怎样排列都不是回文串。
小 P 想知道这棵树中有多少个回文节点。此后还会有 次修改操作,每次将某个节点上的字母改为指定字母。需要在初始时以及每次修改后,分别回答当前树中回文节点的数量。
输入格式
第一行两个整数 ,分别表示节点数和修改次数。
第二行一个长度为 的小写字母字符串,第 个字符表示节点 上的初始字母。
接下来 行,每行一个正整数 和一个小写字母 ,表示将节点 上的字母修改为 。
输出格式
第一行一个整数,表示初始时回文节点的数量。
接下来 行,每行一个整数,表示经过对应修改操作后回文节点的数量。
样例
样例 1 输入
5 2
abaca
4 b
2 c
样例 1 输出
3
5
3
样例解释
初始时树的结构如下(括号内为节点编号):
a(1)
/ \
b(2) a(3)
/ \
c(4) a(5)
节点 、、 的子树各只有一个字母,都是回文节点。节点 的子树字母为 ,三种字母各出现一次,无法排成回文串。节点 的子树字母为 , 出现三次、 和 各一次,也无法排成回文串。初始答案为 。
将节点 改为 后,节点 的子树字母变为 ,节点 的子树字母变为 ,均能排成回文串,答案变为 。
再将节点 改为 后,节点 的子树字母变为 ,节点 的子树字母变为 ,又无法排成回文串,答案变回 。
附加样例
样例 2 见 ex_palintree2.in 和 ex_palintree2.ans。
数据范围
对于所有数据:,,, 为小写字母。
本题采用捆绑测试。只有通过一个子任务的全部测试,才能获得该子任务的分数。
| 子任务 | 分值 | 附加约束 |
|---|---|---|
| , | ||
| 所有修改操作的 均为 , | ||
| 无附加约束 |