思路
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 3e5 + 10; int tr[maxn * 32][2], cnt; int n; int a[maxn], num[maxn * 32]; void add(int x){ int cur = 0; for(int i = 30; i >= 0; i--){ int f = (x >> i) & 1; if(!tr[cur][f]) tr[cur][f] = ++cnt; cur = tr[cur][f]; num[cur]++; } } int query(int x){ int cur = 0, ans = 0; for(int i = 30; i >= 0; i--){ int f = (x >> i) & 1; if(!tr[cur][f]) f ^= 1, ans += 1 << i; cur = tr[cur][f]; } return ans; } void del(int x){ int cur = 0; for(int i = 30; i >= 0; i--){ int f = (x >> i) & 1; num[tr[cur][f]]--; if(!num[tr[cur][f]]){ tr[cur][f] = 0; return ; } cur = tr[cur][f]; } } int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); } int p; for(int i = 1; i <= n; i++){ scanf("%d", &p); add(p); } for(int i = 1; i <= n; i++){ int ans = query(a[i]); printf("%d%c", ans, i == n ? '\n' : ' '); del(ans ^ a[i]); } return 0; }