小塔有一棵由n个节点、n−1条无向边构成的树,每条边的权值为wi。
定义树上两个点(u,v)的权值为,从u到v的简单路径上,全部边权的异或和,特别的,当u和v为同一个点时,权值为0。
小塔会提出q次询间,每次询问要求计算有多少个点到节点u的权值恰好为k。
此题主要考查树的构建与异或运算的基本性质,将树构建完毕后,可以去求出从根节点到每一个节点中所有边权的异或,假设根节点是t,当前要查询的点为u,那么对于点x,它到点u的边权异或等于它到t点的所有边权异或与u点到t的所有边权异或的异或,然后根据异或运算的性质,点u到t点的边权异或与k值的异或即为任意点x到根节点的异或,此时,两点之间的边权异或值即为k
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>