前言
%%%\%\%\%%%%北大爷的题目
正题
题目链接:https://www.luogu.com.cn/problem/U102380
题目大意
nnn个数,求一个数kkk使得max{aixork}max\{a_i\ xor\ k\}max{ai xor k}最小。
解题思路
我们对每一个数按位建到一个TrieTrieTrie里,然后对于每个节点。
- 如果没有子节点,证明是最下面的点,不管
- 如果有一个子节点,那么就直接异或为0,往下走
- 如果有两个字节点,那么证明这两个之中必定有一个要加上2k2^k2k,那么我们选择小的那个即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,t[N*30][2],cnt,root;
int insert(int val){int x=root;for(int i=29;i>=0;i--){int w=(val>>i)&1;if(!t[x][w]) t[x][w]=++cnt;x=t[x][w];}
}
int dfs(int x,int k){if(!t[x][0]&&!t[x][1]) return 0;if(!t[x][0]) return dfs(t[x][1],k-1);if(!t[x][1]) return dfs(t[x][0],k-1);return (min(dfs(t[x][0],k-1),dfs(t[x][1],k-1))|(1<<k));
}
int main()
{scanf("%d",&n);root=cnt=1;for(int i=1;i<=n;i++){int x;scanf("%d",&x);insert(x);}printf("%d",dfs(1,29));
}