目录:
题目:
分析:
异或最大,那么我们尽量使他们每一位都不同,根据这个特性,我们可以将它们拆分成二进制,然后按位查找
例如要找到一个数与 1101 1101 异或起来最大,那么我们就去找 0010 0010 ,这样子它们的异或值就是最大的
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string>
#include<bitset>
#define LL long long
#define seed 233
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
struct node{
int son[2];
node()
{
son[1]=son[0]=0;
}
}trie[3200001];
int num=0;
int ww[100001];
void in(int s)
{
int w;
int f=0;
for(int i=29;i>=0;i--)
{
w=(s>>i)&1;
if(!trie[f].son[w])
trie[f].son[w]=++num;
f=trie[f].son[w];
}
return;
}
int ans=0;
void ask(int s)
{
int tf=0;
int f=0;
int w;
for(int i=29;i>=0;i--)
{
w=((s>>i)&1)^1;
if(trie[f].son[w]==0)
{
w^=1;
if(trie[f].son[w]==0) return;
}
else ans+=(1<<i);
f=trie[f].son[w];
}
return;
}
int main()
{
int n=read();
for(int i=1;i<=n;i++)
{
ww[i]=read();
in(ww[i]);
}
int maxa=0;
for(int i=1;i<=n;i++)
{
ans=0;
ask(ww[i]);
maxa=(maxa>ans?maxa:ans);
}
printf("%d",maxa);
return 0;
}