xortree
XOR Tree
启发式合并一个 \(\log\),set
一个,所以 \(n\log^2n\)。
#include<cstdio>
#include<vector>
#include<unordered_set>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
const int N=200010;
int n,a[N],d[N],ans;
vector<int>g[N];
unordered_set<int>s[N];
void dfs(int x,int fa){
s[x].insert(d[x]);
bool flag=0;
for(int v:g[x]){
if(v==fa)continue;
d[v]=d[x]^a[v];
dfs(v,x);
if(s[x].size()<s[v].size())swap(s[x],s[v]);
for(int w:s[v])
if(s[x].find(a[x]^w)!=s[x].end())
flag=1;
for(int w:s[v])s[x].insert(w);
}
if(flag)ans++,s[x].clear();
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&n);
E(i, n)scanf("%d",a+i);
d[1]=a[1];
E(i, n-1){
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(b),g[b].push_back(a);
}
dfs(1,-1);
printf("%d",ans);
return 0;
}