题目大意:给出一棵有n个节点的树,每个节点对应一个字母。有m个询问,对于第i个询问,输出深度为$h_i$且属于以节点$v_i$为根的子树的所有节点所代表的所有字母在进行重新排列后能否构成一个回文串。
以下面这棵树为例,括号中的为每个节点代表的字母。
1(z)
|
---------------------
| | |
2(a) 3(c) 4(c)
| |
--------- ---------
| | | |
7(c) 8(d) 5(e) 6(e)
对树进行DFS,并记录每个深度下的所有节点(按DFS序排列)。下面就是记录的结果,括号中的为该节点的DFS序号。
深度为1: 1(1)
深度为2: 2(2), 3(3), 4(6)
深度为3: 7(4), 8(5), 5(7), 6(8)
对于询问i,在$D[h_i]$中用节点$v_i$的第一个和最后一个儿子的DFS序号进行二分查找,就可以获得询问要求的节点序列。
统计这些节点中各个字母的出现次数,若出现奇数次的字母不超过一个,就可以构成回文串。
暴力统计显然太慢。因为字母只有26个,所以可以用一个整数的各个二进制位来表示各个字母出现次数的奇偶性,DFS时顺便对每个深度的节点序列所代表的字母做前缀异或和,位运算乱搞就行了。
代码在此。