图论|Codeforces Round #316 (Div. 2) D. Tree Requests

Codeforces Round #316 (Div. 2) D. Tree Requests
题意:

给一棵树,每个节点上都唯一对应一个单词,给M个询问,问节点u的子树中,深度为h的节点上所有的单词以任意次序组合起来能否构成回文串?
思路:
【图论|Codeforces Round #316 (Div. 2) D. Tree Requests】首先呢,我们必须得处理出内节点所在的深度,而且得知道对应深度下有哪些节点存于vector数组H[d]中,但是问题就是询问仅涉及到节点为u的子树的哪些节点,所以满足条件的节点应该为数组中的某一段,那么如何去找这一段呢? 利用dfs序+二分查找,就能得到满足条件的节点所对应的区间,剩下的问题就是,如何求是否为回文串,因为次序任意,所以只要出现次数为奇数的单词的个数不超过2就行了,这个肯定是需要去预处理出整个区间的啦,方法就是利用位运算 + 异或 解决!
代码如下:
#include #include #include #include #include #include #include #include #include #include #define PB push_back #define FT first #define SD second #define MP make_pair #define INF (0x3f3f3f3f)*2 using namespace std; typedef long long LL; typedef pairP; const int maxn=5+1e6,MOD=7+1e9; vector G[maxn]; vector< pair > H[maxn]; char ss[maxn]; int A[30],ord,in[maxn],out[maxn]; void dfs(int u,int d) { in[u] = ++ord; H[d].PB(MP(ord,H[d].back().SD ^ A[ss[u]-'a'])); for(int i=0; i

    推荐阅读