#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
template < class T> inline void walloc2d( T *** arr, int x, int y, void ** mem = & wmem) {
int i;
walloc1d( arr, x, mem) ;
for ( i= ( 0 ) ; i< ( x) ; i++ ) {
walloc1d( & ( ( * arr) [ i] ) , y, mem) ;
}
}
template < class T> inline void walloc2d( T *** arr, int x1, int x2, int y1, int y2, void ** mem = & wmem) {
int i;
walloc1d( arr, x1, x2, mem) ;
for ( i= ( x1) ; i< ( x2) ; i++ ) {
walloc1d( & ( ( * arr) [ i] ) , y1, y2, mem) ;
}
}
template < class T> T Hungarian( T ** mat, int n, int m, int match[ ] = NULL , void * mem = wmem) {
int i;
int a;
int b;
int c;
int r;
int z;
int * toright;
int * toleft;
T* ofsleft;
T* ofsright;
int * left;
int * right;
int * trace;
int * ptr;
T d;
T t;
T res = 0 ;
walloc1d( & toright, n, & mem) ;
walloc1d( & toleft, m, & mem) ;
walloc1d( & ofsleft, n, & mem) ;
walloc1d( & ofsright, m, & mem) ;
walloc1d( & left, n, & mem) ;
walloc1d( & right, m, & mem) ;
walloc1d( & trace, m, & mem) ;
walloc1d( & ptr, m, & mem) ;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
toright[ i] = - 1 ;
ofsleft[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
toleft[ i] = - 1 ;
ofsright[ i] = 0 ;
}
for ( r= ( 0 ) ; r< ( n) ; r++ ) {
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
left[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
right[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
trace[ i] = - 1 ;
ptr[ i] = r;
}
left[ r] = 1 ;
for ( ;; ) {
d = std:: numeric_limits < T> :: max ( ) ;
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
if ( ! right[ i] ) {
t = mat[ ptr[ i] ] [ i] + ofsleft[ ptr[ i] ] + ofsright[ i] ;
if ( d > t) {
d = t;
b = i;
}
}
}
res + = d;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
if ( left[ i] ) {
ofsleft[ i] - = d;
}
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
if ( right[ i] ) {
ofsright[ i] + = d;
}
}
trace[ b] = ptr[ b] ;
c = toleft[ b] ;
if ( c < 0 ) {
while ( b>= 0 ) {
a = trace[ b] ;
z = toright[ a] ;
toleft[ b] = a;
toright[ a] = b;
b = z;
}
break ;
}
right[ b] = left[ c] = 1 ;
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
if ( mat[ c] [ i] + ofsleft[ c] + ofsright[ i] < mat[ ptr[ i] ] [ i] + ofsleft[ ptr[ i] ] + ofsright[ i] ) {
ptr[ i] = c;
}
}
}
}
if ( match! = NULL ) {
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
match[ i] = toright[ i] ;
}
}
return res;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
int minimumXORSum( vector< int > & A, vector< int > & B) {
int i;
dummy_main( ) ;
int ** mat;
int N = A.size ( ) ;
walloc2d( & mat,N,N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( N) ; j++ ) {
mat[ i] [ j] = A[ i] ^ B[ j] ;
}
}
return Hungarian( mat, N, N) ;
}
}
;
// cLay version 20210607-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
//
// class Solution {
// public:
// int minimumXORSum(vector<int>& A, vector<int>& B) {
// dummy_main();
// int **mat, N = A.size();
// walloc2d(&mat,N,N);
// rep(i,N) rep(j,N) mat[i][j] = A[i] ^ B[j];
// return Hungarian(mat, N, N);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeDEsIGludCB4Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICB3YWxsb2MxZChhcnIsIHgyLXgxLCBtZW0pOwogICgqYXJyKSAtPSB4MTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MyZChUICoqKmFyciwgaW50IHgsIGludCB5LCB2b2lkICoqbWVtID0gJndtZW0pewogIGludCBpOwogIHdhbGxvYzFkKGFyciwgeCwgbWVtKTsKICBmb3IoaT0oMCk7aTwoeCk7aSsrKXsKICAgIHdhbGxvYzFkKCYoKCphcnIpW2ldKSwgeSwgbWVtKTsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMmQoVCAqKiphcnIsIGludCB4MSwgaW50IHgyLCBpbnQgeTEsIGludCB5Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICBpbnQgaTsKICB3YWxsb2MxZChhcnIsIHgxLCB4MiwgbWVtKTsKICBmb3IoaT0oeDEpO2k8KHgyKTtpKyspewogICAgd2FsbG9jMWQoJigoKmFycilbaV0pLCB5MSwgeTIsIG1lbSk7CiAgfQp9CnRlbXBsYXRlPGNsYXNzIFQ+IFQgSHVuZ2FyaWFuKFQgKiptYXQsIGludCBuLCBpbnQgbSwgaW50IG1hdGNoW10gPSBOVUxMLCB2b2lkICptZW0gPSB3bWVtKXsKICBpbnQgaTsKICBpbnQgYTsKICBpbnQgYjsKICBpbnQgYzsKICBpbnQgcjsKICBpbnQgejsKICBpbnQqdG9yaWdodDsKICBpbnQqdG9sZWZ0OwogIFQqb2ZzbGVmdDsKICBUKm9mc3JpZ2h0OwogIGludCpsZWZ0OwogIGludCpyaWdodDsKICBpbnQqdHJhY2U7CiAgaW50KnB0cjsKICBUIGQ7CiAgVCB0OwogIFQgcmVzID0gMDsKICB3YWxsb2MxZCgmdG9yaWdodCwgbiwgJm1lbSk7CiAgd2FsbG9jMWQoJnRvbGVmdCwgbSwgJm1lbSk7CiAgd2FsbG9jMWQoJm9mc2xlZnQsIG4sICZtZW0pOwogIHdhbGxvYzFkKCZvZnNyaWdodCwgbSwgJm1lbSk7CiAgd2FsbG9jMWQoJmxlZnQsIG4sICZtZW0pOwogIHdhbGxvYzFkKCZyaWdodCwgbSwgJm1lbSk7CiAgd2FsbG9jMWQoJnRyYWNlLCBtLCAmbWVtKTsKICB3YWxsb2MxZCgmcHRyLCBtLCAmbWVtKTsKICBmb3IoaT0oMCk7aTwobik7aSsrKXsKICAgIHRvcmlnaHRbaV0gPSAtMTsKICAgIG9mc2xlZnRbaV0gPSAwOwogIH0KICBmb3IoaT0oMCk7aTwobSk7aSsrKXsKICAgIHRvbGVmdFtpXSA9IC0xOwogICAgb2ZzcmlnaHRbaV0gPSAwOwogIH0KICBmb3Iocj0oMCk7cjwobik7cisrKXsKICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBsZWZ0W2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChtKTtpKyspewogICAgICByaWdodFtpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwobSk7aSsrKXsKICAgICAgdHJhY2VbaV0gPSAtMTsKICAgICAgcHRyW2ldID0gcjsKICAgIH0KICAgIGxlZnRbcl0gPSAxOwogICAgZm9yKDs7KXsKICAgICAgZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOwogICAgICBmb3IoaT0oMCk7aTwobSk7aSsrKXsKICAgICAgICBpZighcmlnaHRbaV0pewogICAgICAgICAgdCA9IG1hdFtwdHJbaV1dW2ldICsgb2ZzbGVmdFtwdHJbaV1dICsgb2ZzcmlnaHRbaV07CiAgICAgICAgICBpZihkID4gdCl7CiAgICAgICAgICAgIGQgPSB0OwogICAgICAgICAgICBiID0gaTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzICs9IGQ7CiAgICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICAgIGlmKGxlZnRbaV0pewogICAgICAgICAgb2ZzbGVmdFtpXSAtPSBkOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IoaT0oMCk7aTwobSk7aSsrKXsKICAgICAgICBpZihyaWdodFtpXSl7CiAgICAgICAgICBvZnNyaWdodFtpXSArPSBkOwogICAgICAgIH0KICAgICAgfQogICAgICB0cmFjZVtiXSA9IHB0cltiXTsKICAgICAgYyA9IHRvbGVmdFtiXTsKICAgICAgaWYoYyA8IDApewogICAgICAgIHdoaWxlKGI+PTApewogICAgICAgICAgYSA9IHRyYWNlW2JdOwogICAgICAgICAgeiA9IHRvcmlnaHRbYV07CiAgICAgICAgICB0b2xlZnRbYl0gPSBhOwogICAgICAgICAgdG9yaWdodFthXSA9IGI7CiAgICAgICAgICBiID0gejsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcmlnaHRbYl0gPSBsZWZ0W2NdID0gMTsKICAgICAgZm9yKGk9KDApO2k8KG0pO2krKyl7CiAgICAgICAgaWYobWF0W2NdW2ldICsgb2ZzbGVmdFtjXSArIG9mc3JpZ2h0W2ldIDwgbWF0W3B0cltpXV1baV0gKyBvZnNsZWZ0W3B0cltpXV0gKyBvZnNyaWdodFtpXSl7CiAgICAgICAgICBwdHJbaV0gPSBjOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBpZihtYXRjaCE9TlVMTCl7CiAgICBmb3IoaT0oMCk7aTwobik7aSsrKXsKICAgICAgbWF0Y2hbaV0gPSB0b3JpZ2h0W2ldOwogICAgfQogIH0KICByZXR1cm4gcmVzOwp9CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IG1pbmltdW1YT1JTdW0odmVjdG9yPGludD4mIEEsIHZlY3RvcjxpbnQ+JiBCKXsKICAgIGludCBpOwogICAgZHVtbXlfbWFpbigpOwogICAgaW50KiptYXQ7CiAgICBpbnQgTiA9IEEuc2l6ZSgpOwogICAgd2FsbG9jMmQoJm1hdCxOLE4pOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGludCBqOwogICAgICBmb3Ioaj0oMCk7ajwoTik7aisrKXsKICAgICAgICBtYXRbaV1bal0gPSBBW2ldIF4gQltqXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEh1bmdhcmlhbihtYXQsIE4sIE4pOwogIH0KfQo7Ci8vIGNMYXkgdmVyc2lvbiAyMDIxMDYwNy0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICBpbnQgbWluaW11bVhPUlN1bSh2ZWN0b3I8aW50PiYgQSwgdmVjdG9yPGludD4mIEIpIHsKLy8gICAgIGR1bW15X21haW4oKTsKLy8gICAgIGludCAqKm1hdCwgTiA9IEEuc2l6ZSgpOwovLyAgICAgd2FsbG9jMmQoJm1hdCxOLE4pOwovLyAgICAgcmVwKGksTikgcmVwKGosTikgbWF0W2ldW2pdID0gQVtpXSBeIEJbal07Ci8vICAgICByZXR1cm4gSHVuZ2FyaWFuKG1hdCwgTiwgTik7Ci8vICAgfQovLyB9Owo=