题目链接:https://codeforces.com/contest/1285/problem/D
题目大意:给你n个,让你寻找一个x使得,max 1≤i≤n (ai⊕X) 最小。
输出这个最小值。

思路:从高位开始,

如果这位有的数是,有的是0,那么x这位取1,max答案就在这位是0的那些数当。那么x这位取1,max答案就在这位是0的那些数当中。取0还是1就看这两堆数谁在pos-1 - 0位取得的最大值最小。

如果这位只有0,那么X这位是1

如果这位只有1,那么X这位是0

字典树上分治一下就好了。

#include <bits/stdc++.h>
#define LL long long
using namespace std;

struct Tree{
    Tree *L, *R;
    Tree(){
        L=NULL, R=NULL;
    }
}root;

int a[100005];

void Insert(Tree *root, int s, int pos){//建树
    if(pos==-1){
        return ;
    }
    if(s&(1<<pos)){
        if(root->R==NULL){
            root->R=new Tree();
        }
        Insert(root->R, s, pos-1);
    }
    else{
        if(root->L==NULL){
            root->L=new Tree();
        }
        Insert(root->L, s, pos-1);
    }
}

int DFS(Tree *root, int pos){//分治


    if(pos==-1||root==NULL){
        return 0;
    }
    if(root->L==NULL){
        return DFS(root->R, pos-1);
    }
    if(root->R==NULL){
        return DFS(root->L, pos-1);
    }
    return min(DFS(root->L, pos-1), DFS(root->R, pos-1))+(1<<pos);


}

int main(){

    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
        Insert(&root, a[i], 29);
    }
    printf("%d\n", DFS(&root, 29));

    return 0;
}