
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