题目链接: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;
}