func_code_string: #include <bits/stdc++.h>   using namespace ::std;   const long double PI = acos(-1);   const long long MOD = 1000000000 + 7;   long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }   long long add(long long a, long long b, long long m = MOD) {     if (a >= m) a %= m;     if (b >= m) b %= m;     if (a < 0) a += m;     if (b < 0) b += m;     long long res = a + b;     if (res >= m or res <= -m) res %= m;     if (res < 0) res += m;     return res;   }   long long mul(long long a, long long b, long long m = MOD) {     if (a >= m) a %= m;     if (b >= m) b %= m;     if (a < 0) a += m;     if (b < 0) b += m;     long long res = a * b;     if (res >= m or res <= -m) res %= m;     if (res < 0) res += m;     return res;   }   long long pow_mod(long long a, long long b, long long m = MOD) {     long long res = 1LL;     a = a % m;     while (b) {       if (b & 1) res = mul(res, a, m);       b >>= 1;       a = mul(a, a, m);     }     return res;   }   long long fastexp(long long a, long long b) {     long long res = 1LL;     while (b) {       if (b & 1) res = res * a;       b >>= 1;       a *= a;     }     return res;   }   int gcdExtendido(int a, int b, int *x, int *y) {     if (a == 0) {       *x = 0;       *y = 1;       return b;     }     int x1, y1;     int gcd = gcdExtendido(b % a, a, &x1, &y1);     *x = y1 - (b / a) * x1;     *y = x1;     return gcd;   }   int modInverso(int a, int m) {     int x, y;     int g = gcdExtendido(a, m, &x, &y);     if (g != 1)       return -1;     else       return (x % m + m) % m;   }   const int N = 300000 + 5;   const int L = 30;   const int SUML = 300000 * 30 + 5;   const int E = 2;   int n;   int a[N];   int nodes = 1;   int frec[SUML];   int trie[SUML][E];   void insert(int x) {     int pos = 0;     for (int i = L - 1; i >= 0; i--) {       int nxt = (x >> i) & 1;       if (trie[pos][nxt] == 0) {         trie[pos][nxt] = nodes++;       }       pos = trie[pos][nxt];       frec[pos] += 1;     }   }   void erase(int val) {     int pos = 0;     for (int i = L - 1; i >= 0; i--) {       int nxt = (val >> i) & 1;       pos = trie[pos][nxt];       frec[pos] -= 1;     }   }   int getMin(int x) {     int ans = 0;     int pos = 0;     for (int i = L - 1; i >= 0; i--) {       int have = (x >> i) & 1;       int nxt = have;       if (frec[trie[pos][nxt]] == 0) nxt ^= 1;       ans |= (nxt ^ have) << i;       pos = trie[pos][nxt];     }     return ans;   }   int main() {     scanf( %d , &(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++) {       int cur = getMin(a[i]);       erase(cur ^ a[i]);       printf( %d%c , cur,    n [i == n]);     }     return 0;   }   