HDU 5416 CRB and Tree (2015多校第10场)
|  | 
| CRB and TreeTime Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 481 Accepted Submission(s): 151 
Problem Description 
CRB has a tree, whose vertices are labeled by 1, 2, …,    For any two vertices           CRB’s task is for given                 
Input 
There are multiple test cases. The first line of input contains an integer   The first line contains an integer  Each of the next        The next line contains an integer  Each of the next   1 ≤  1 ≤     1 ≤  1 ≤    0 ≤      It is guaranteed that given edges form a tree. 
Output 
For each query, output one line containing the answer. 
Sample Input 
 
Sample Output 
 
Author 
KUT(DPRK) 
解题思路: 
由于异或是可逆的,因此从前到后记录前缀异或和,用hash表记录每一个值出现的次数,每次仅仅须要加上x ^ sum[v]出现的次数就可以。由于此时,u到v的异或和就是x。 #include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <algorithm>
#define LL long long 
using namespace std;
const int MAXN = 100000 + 10;
struct Edge
{
	int to, next, w;
}edge[MAXN<<1];
int tot, head[MAXN];
int read()
{
	int res = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-') f *= -1; ch = getchar();}
	while(ch >= '0' && ch <= '9'){res = res * 10 + ch - '0'; ch = getchar();}
	return res;
}
void init()
{
	tot = 0;
	memset(head, -1, sizeof(head));
}
void addedge(int u, int v, int w)
{
	edge[tot].to = v;
	edge[tot].w = w;
	edge[tot].next = head[u];
	head[u] = tot++;
}
int N, Q;
int vis[MAXN], st[MAXN<<2], op;
LL ans;
void dfs(int u, int x)
{
	vis[u] = 1; st[x]++;
	ans += st[op ^ x];
	for(int i=head[u];i!=-1;i=edge[i].next)
	{
		int v = edge[i].to, w = edge[i].w;
		if(!vis[v])
		{
			dfs(v, x ^ w);
		}
	}
}
int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		N = read();
		int u, v, w;
		init();
		for(int i=1;i<N;i++)
		{
			u = read(); v = read(); w = read();
			addedge(u, v, w);
			addedge(v, u, w);
		}
		scanf("%d", &Q);
		while(Q--)
		{
			op = read();
			memset(vis, 0, sizeof(vis));
			memset(st, 0, sizeof(st));
			ans = 0;
			dfs(1, 0);
			printf("%I64d\n", ans);
		}
	}
	return 0;
} | 
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号