LOJ10050 The XOR Largest Pair
题目链接:LOJ10050 The XOR Largest Pair
题意:给定
n
n
n 个非负整数,任取两个数,使得这两个数的异或结果最大,求这个最大值
肯定不是朴素枚举啊qwq
直接用Trie存每个数的二进制就可以了(注:把二进制看作字符串)
根据异或的定义,对于每个
a
j
a_j
aj? ,我们从最高位开始,尽可能取与
a
i
a_i
ai? 这一位相反的那一条路,一定可以得到最大值
至于最高位,我们只要不够的补
0
0
0 即可
因为它题目中说了每个数最大不大于
2
31
?
1
2^{31}-1
231?1? ,那么我们直接保存为30位二进制即可
代码如下
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN (int)(1e5+5)
#define INF 0x3f3f3f3f3f3f3f3f
template<typename T>inline void read(T &k)
{
char ch=getchar();T x=0,f=1;
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
k=x*f;
}
template<typename T>void write(T k)
{
if(k<0){putchar('-');k=-k;}
if(k>9)write(k/10);
putchar(k%10+'0');
}
int n,ans=0;
int a[MAXN];
struct Trie
{
int trie[MAXN*32][3],tot=1;
void insert(int x)
{
int p=1;
for(int i=31; i>=0; --i)
{
int k=(x>>i)&1;
if(!trie[p][k])trie[p][k]=++tot;
p=trie[p][k];
}
}
int qry(int x)
{
int ans=0,p=1;
for(int i=31; i>=0; --i)
{
int k=(x>>i)&1;
if(trie[p][k^1])p=trie[p][k^1],ans|=(1<<i);
else p=trie[p][k];
}
return ans;
}
}t[1];
signed main()
{
read(n);
for(int i=1; i<=n; i++)
{
read(a[i]);
t[0].insert(a[i]);
ans=max(ans,t[0].qry(a[i]));
}
write(ans);putchar('\n');
return 0;
}
转载请说明出处
|