网站如何做数据分析,建筑工程网络图分为,静态网页的制作,南京网站网站建设学校前言 %%%\%\%\%%%%北大爷的题目 正题
题目链接:https://www.luogu.com.cn/problem/U102380 题目大意 nnn个数#xff0c;求一个数kkk使得max{aixork}max\{a_i\ xor\ k\}max{ai xor k}最小。 解题思路
我们对每一个数按位建到一个TrieTrieTrie里#xff0c;然后对于每个节…前言
%%%\%\%\%%%%北大爷的题目 正题
题目链接: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
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N1e510;
int n,t[N*30][2],cnt,root;
int insert(int val){int xroot;for(int i29;i0;i--){int w(vali)1;if(!t[x][w]) t[x][w]cnt;xt[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))|(1k));
}
int main()
{scanf(%d,n);rootcnt1;for(int i1;in;i){int x;scanf(%d,x);insert(x);}printf(%d,dfs(1,29));
}