题意:给出一棵树,每个点上有权值,有m组询问,每次询问从x到y的路径上的权值与z异或的最大值为多少。
思路:把每个点的权值用二进制表示,然后插入Trie。利用可持久化Trie可以查询历史信息的特点,每个节点保存从当前点到根节点的Trie。对于每个查询,在Trie中查询,对于每一位,寻找与z对应位相反的分支,如果有,结果res|=(1<<i),继续查询,否则,查找与z对应位相同的分支。
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f