就把p加入字典树
然后删除.....
写法和上一题差不多,所以不说了....
#include <bits/stdc++.h>
using namespace std;
const int maxn=6e6+10;
int n,m,zi[maxn][3],id,isok[maxn],cnt[maxn][3],a[maxn];
bool ok[maxn];
void insert(int x)
{
int now=0;
for(int i=30;i>=0;i--)
{
int w = ((x>>i)&1);
if( !zi[now][w] ) zi[now][w]=++id;
cnt[now][w]++;
now = zi[now][w];
}
}
int ask(int x)
{
int ans=0,now=0;
for(int i=30;i>=0;i--)
{
int w = ((x>>i)&1),x;
if( zi[now][w] )
{
cnt[now][w]--;
x = zi[now][w];
if( cnt[now][w]==0 ) zi[now][w]=0;
}
else
{
cnt[now][w^1]--;
x = zi[now][w^1];
ans+=(1<<i);
if( cnt[now][w^1]==0 ) zi[now][w^1]=0;
}
now = x;
}
return ans;
}
signed main()
{
cin >> n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
int x; scanf("%d",&x);
insert(x);
}
for(int i=1;i<=n;i++)
printf("%d ",ask(a[i]));
}
京公网安备 11010502036488号