因为要求所有路径的异或和,而异或又有个特殊性质
a xor a =0
因此只需要求每个点在最短路径上的出现次数
可以通过计算与点相连的边的经过次数来计算点的次数

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
#define _int __int128_t
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
    return f*x;
}
void print(int x)
{
    if(x < 0) {putchar('-');x = -x;}
    if(x/10) print(x/10);
    putchar(x%10+'0');
}
struct node
{
    int to,next;
}edge[1000005];
int n,m,sz[1000005],tot,head[1000005],vis[1000005],ans;
void add(int u, int v)
{
    edge[++tot].next=head[u];
    edge[tot].to=v;
    head[u]=tot;
}
void dfs(int u, int p)
{
    sz[u]=1;
    int num=n-1;
    for(int i=head[u]; i ;i=edge[i].next){
        int v=edge[i].to;
        if(v==p)
            continue;
        dfs(v,u);
        num+=sz[v]*(n-sz[v]);
        sz[u]+=sz[v];
    }
    num+=sz[u]*(n-sz[u]);
    num/=2;
    if(num&1)
        ans^=vis[u];
}
int main ()
{
    int T,i,t,j,k,p,sum=0;
    n=read();
    for(i=1;i<n;++i){
        int u=read(),v=read();
        add(u,v);
        add(v,u);
    }
    for(i=1;i<=n;++i)
        vis[i]=read();
    dfs(1,0);
    cout<<ans<<endl;

    return 0;
}