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;
}
posted @ 2023-09-26 14:09  wscqwq  阅读(4)  评论(0编辑  收藏  举报