1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include<bits/stdc++.h> using namespace std; int read(){ int x = 0,f = 0;char ch = getchar(); while(!isdigit(ch)) {if(ch == '-')f=1;ch=getchar();} while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();} return f ? -x : x; } const int N = 2e5+100,M = (2e5+100) * 31; int rt[2],ch[M][2],cnt[M],si; int A[N],B[N],n; vector<int> Ans; void insert(int a,int t,int x){ if(t < 0) return; int i = (x>>t)&1; if(!ch[a][i]) ch[a][i] = ++si; cnt[ch[a][i]]++; insert(ch[a][i],t-1,x); } void print(int a,int b,int x,int t,int num){ if(t < 0) {for(int i = 1;i <= num;i++) Ans.push_back(x);return;} if(cnt[ch[a][0]] && cnt[ch[b][0]]){ int sum = min(cnt[ch[a][0]],cnt[ch[b][0]]); sum = min(num,sum); print(ch[a][0],ch[b][0],x,t-1,sum); cnt[ch[a][0]] -= sum;cnt[ch[b][0]] -= sum;num -= sum; } if(cnt[ch[a][1]] && cnt[ch[b][1]]){ int sum = min(cnt[ch[a][1]],cnt[ch[b][1]]); sum = min(sum,num); print(ch[a][1],ch[b][1],x,t-1,sum); cnt[ch[a][1]] -= sum;cnt[ch[b][1]] -= sum;num -= sum; } if(cnt[ch[a][1]] && cnt[ch[b][0]]){ int sum = min(cnt[ch[a][1]],cnt[ch[b][0]]); sum = min(sum,num); print(ch[a][1],ch[b][0],x+(1<<t),t-1,sum); cnt[ch[a][1]] -= sum;cnt[ch[b][0]] -= sum;num -= sum; } if(cnt[ch[a][0]] && cnt[ch[b][1]]){ int sum = min(cnt[ch[a][0]],cnt[ch[b][1]]); sum = min(sum,num); print(ch[a][0],ch[b][1],x+(1<<t),t-1,sum); cnt[ch[a][0]] -= sum;cnt[ch[b][1]] -= sum;num -= sum; } } int main() { n = read();rt[0] = ++si;rt[1] = ++si; for(int i = 1;i <= n;i++) A[i] = read(),insert(rt[0],30,A[i]); for(int i = 1;i <= n;i++) B[i] = read(),insert(rt[1],30,B[i]); print(rt[0],rt[1],0,30,n); sort(Ans.begin(),Ans.end()); for(int i = 0;i < Ans.size();i++) printf("%d ",Ans[i]); }
|