U102380-简单数据结构题【Trie】

前言

% % % \%\%\% 北大爷的题目


正题

题目链接:https://www.luogu.com.cn/problem/U102380


题目大意

n n 个数,求一个数 k k 使得 m a x { a i   x o r   k } max\{a_i\ xor\ k\} 最小。


解题思路

我们对每一个数按位建到一个 T r i e Trie 里,然后对于每个节点。

  1. 如果没有子节点,证明是最下面的点,不管
  2. 如果有一个子节点,那么就直接异或为0,往下走
  3. 如果有两个字节点,那么证明这两个之中必定有一个要加上 2 k 2^k ,那么我们选择小的那个即可。

c o d e code

#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));
}
发布了867 篇原创文章 · 获赞 55 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/104021036