就把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])); }