|
CRB and TreeTime Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 607 Accepted Submission(s): 194
Problem Description
CRB has a tree, whose vertices are labeled by 1, 2, …,
N
. They are connected by
N
– 1 edges. Each edge has a weight.
For any two vertices u and v (possibly equal), f(u,v) is xor(exclusive-or) sum of weights of all edges on the path from u to v . CRB’s task is for given s , to calculate the number of unordered pairs (u,v) such that f(u,v) = s . Can you help him?
Input
There are multiple test cases. The first line of input contains an integer
T
, indicating the number of test cases. For each test case:
The first line contains an integer N denoting the number of vertices. Each of the next N - 1 lines contains three space separated integers a , b and c denoting an edge between a and b , whose weight is c . The next line contains an integer Q denoting the number of queries. Each of the next Q lines contains a single integer s . 1 ≤ T ≤ 25 1 ≤ N ≤ 105 1 ≤ Q ≤ 10 1 ≤ a , b ≤ N 0 ≤ c , s ≤ 105 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)
Source
Recommend
|
#include <cstdio>
#include <cstring>
#include <iostream>
#include <set>
using namespace std;
#define LL long long
#define N 100000 + 10
int n, q, s, T;
int head[N], tot;
int m[2 * N];
int dist[N];
struct edge
{
int v, w, next;
}e[2 * N];
void init()
{
tot = 0;
memset(head, -1, sizeof head);
memset(m, 0, sizeof m);
}
void adde(int u, int v, int w)
{
e[tot].v = v;
e[tot].w = w;
e[tot].next = head[u];
head[u] = tot++;
}
void dfs(int u, int fa, int val)
{
dist[u] = val;
m[val]++;
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(v == fa) continue;
dfs(v, u, val ^ e[i].w);
}
}
void solve()
{
LL ans = 0;
int j ;
for(int i = 1; i <= n; i++)
{
j = dist[i] ^ s;
if(j == dist[i]) ans += m[j] - 1;
else ans += m[j];
}
ans /= 2;
if(s == 0) ans += n;
printf("%I64d\n", ans);
}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
init();
int u, v, w;
for(int i = 1; i < n; i++)
{
scanf("%d%d%d", &u, &v, &w);
adde(u, v, w);
adde(v, u, w);
}
dfs(1, -1, 0);
scanf("%d", &q);
for(int i = 0; i < q; i++)
{
scanf("%d", &s);
solve();
}
}
return 0;
}
/*
1
3
1 2 1
2 3 2
3
2
3
4
1
5
1 2 1
3 5 2
1 3 2
2 4 2
10
0
3
2
*/