[CSU1216]异或最大值

最大异或和

题解

把二进制数放在树上,然后枚举每个数,根据贪心的思路在trie树上尽量往反方向就好了
单纯的为了写一下trie

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
const int maxn=100010;
int n,a[maxn],ch[32*maxn][2],val[32*maxn],sz,ans;
void insert(int x)
{
	int now=0;
	for(int i=31;i>=0;i--)
	{
		int c=(x>>i)&1;
		if(!ch[now][c])ch[now][c]=++sz;
		now=ch[now][c];
	}
	val[now]=1;
}
int search(int x)
{
	int res=0,now=0;
	for(int i=31;i>=0;i--)
	{
		int c=(x>>i)&1;
		if(ch[now][c^1])c^=1;
		res|=(c<<i);
		now=ch[now][c];
	}
	return res;
}	 
int main()	
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i],insert(a[i]);
	for(int i=1;i<=n;i++)ans=max(ans,a[i]^search(a[i]));
	cout<<ans<<endl;
	return 0;
}
posted @ 2020-02-07 18:19  小飞淙的云端  阅读(145)  评论(0编辑  收藏  举报