最大异或对
题目链接:https://www.acwing.com/problem/content/145/
题意:在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?
思路:可以将每个数化成二进阶01串,插入字典树中,检索时尽量沿着与当前位相反的字符串指针向下访问;
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<math.h> using namespace std; int tot=0; int trie[5000010][3]; void insert(int n) { int p=0; for(int i=30;i>=0;i--) { int w=n>>i&1; if(trie[p][w]==0) trie[p][w]=++tot; p=trie[p][w]; } return; } int fun1(int n) { int p=0,sum=0; for(int i=30;i>=0;i--) { int s=n>>i&1; int w=1-s; if(trie[p][w]) { int x=1<<i; sum=sum+x; p=trie[p][w]; } else p=trie[p][s]; } return sum; } int main() { int i,j,n,sum,x; while(~scanf("%d",&n)) { tot=0; memset(trie,0,sizeof(trie)); sum=0; for(i=0;i<n;i++) { scanf("%d",&x); insert(x); int s=fun1(x); sum=max(sum,s); } printf("%d\n",sum); } return 0; }