求助,关于字典树
  • 板块学术版
  • 楼主HyperLuXury
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/9/9 22:16
  • 上次更新2023/11/4 07:12:03
查看原帖
求助,关于字典树
219423
HyperLuXury楼主2021/9/9 22:16

The XOR Largest Pair

字典树求最大的一对数异或值

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,x,tot,ans,trie[5000005][2];
inline int read(){
	int x=0,y=1;char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) y-=(c=='-')<<1;
	for(;c>='0'&&c<='9';c=getchar()) x=x*10+(c&15);
	return x*y;
}
int find(int x){
	int u=1,ans=0;
	for(int i=30;i>=0;i--){
		int c=(x>>i)&1;c=!c;
		if(trie[u][c]) u=trie[u][c],ans+=1<<i;
		else u=trie[u][!c];
	}
	return ans;
}
void insert(int x){
	int u=1;
	for(int i=30;i>=0;i--){
		int c=(x>>i)&1;
		if(!trie[u][c]) trie[u][c]=++tot;
		u=trie[u][c];
	}
}
int main(){
	n=read();tot=1;
	for(int i=1;i<=n;i++){
		x=read();
		ans=max(ans,find(x));
		insert(x);
	}
	printf("%d\n",ans);
}

为什么for(int i=30;i>=0;i--)里i要等于30啊?其他数就会错

数据范围如下:

每个数小于2^31

2021/9/9 22:16
加载中...