T192901 智乃的异或

传送门

某位师兄出的题

也可当01trie模板用

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
int tree[10000001][2],cnt=0;
int Min(int XX,int YY){
    if(XX<YY) return XX;
    return YY;
}
int add(int zx,int x,int p){
    if(p==0) return 0;
    if((x&(1<<(p-1)))==0){
        if(tree[zx][0]==0) tree[zx][0]=++cnt;
        add(tree[zx][0],x,p-1);
    }
    else{
        if(tree[zx][1]==0) tree[zx][1]=++cnt;
        add(tree[zx][1],x,p-1);
    }
    return 0;
}
int cx(int ws,int hh){
    if(tree[ws][0]==0&&tree[ws][1]==0) return 0;
    if(tree[ws][0]!=0&&tree[ws][1]==0) return cx(tree[ws][0],hh-1);
    if(tree[ws][0]==0&&tree[ws][1]!=0) return cx(tree[ws][1],hh-1);
    if(tree[ws][0]!=0&&tree[ws][1]!=0){
        int zc=Min(cx(tree[ws][0],hh-1),cx(tree[ws][1],hh-1));
        return (1<<(hh-1))+zc;
    }
}
int main(){
    int minn=INF,n,a[1000001];
    scanf("%d",&n);
    cnt=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        add(1,a[i],30);
    }
    cout<<cx(1,30);
    return 0;
}

 

posted @ 2021-08-10 22:01  latent_Lin  阅读(25)  评论(0)    收藏  举报