链接:http://codeforces.com/contest/570/problem/D
题意:给定一棵n个节点的树(1为根),每个节点上有一个小写字母,m个询问:给定v,h,问在以v为根的子树中深度为h(相对整棵树的深度)的所有点的字符能否组成回文串。
分析:我们来将题目分解一下,首先我们确定构成回文串的条件,很显然要求“字母个数为奇数的字母小于等于1”,这里我们可以用异或储存偶数为0奇数为1,这样我们只要判断这个二进制数中有几个1就行了。然后我们分析子树v和深度h这两个条件,首先子树v我们可以想到dfs序可以将一颗子树的节点排在一段连续的位置,深度h我们可以想到从根开始bfs的话相同深度的点也会在一起。那么我们可以将这两个条件结合一下得到:bfs的同一层的点是在一段连续的区间内,并且也有同一颗子树中的同一深度的节点也会在一段连续的区间内,那么我们在这段区间中找dfs序在根v的dfs序范围内的点就好了,然后将异或值用前缀异或和优化即可。详见代码。O(n+m*logn)
代码:
#include
推荐阅读