题目大意
对于一个序列,多次询问求在 xor K 的情况下最大值。
分析
我们将每一个数拆分成 2 进制,然后映射进一棵 trie 中,然后对于每个询问,根据异或的性质(1 xor 1=0,1 xor 0=1,0 xor1=1,0 xor 0=0)尽可能的匹配,因为是 32 位整数,所以每次询问效率就是 O(32)。
参考程序
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
long long l=1;
long long x;
int i;
long long f[4000100][3];
void maketree(long long jz,long long k)
{
int t;
long long wei=1<<(jz-1);
if (jz==0)
{
f[k][2]=i;
return;
}
if ((x & wei)>0) t=1;
else t=0;
if (f[k][t]==0)
f[k][t]=++l;
maketree(jz-1,f[k][t]);
}
void dg(long long jz,long long k)
{
int t;
if (jz==0)
{
printf("%lld\n",f[k][2]);
return;
}
long long wei=1<<(jz-1);
if ((x & wei)>0) t=1;
else t=0;
if (f[k][1-t]!=0) dg(jz-1,f[k][1-t]);
else dg(jz-1,f[k][t]);
}
int main()
{
long long n,m;
scanf("%lld%lld",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%lld",&x);
maketree(31,1);
}
for (i=1;i<=m;i++)
{
scanf("%lld",&x);
dg(31,1);
}
}