#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

map <int, int> Map;
map <int, vector <int> > pos;

int n, m, x, y, A[N], B[N], C[N];

#define Exit exit(0 * puts("-1"))

map <int, int> fa;

int getf(int x) {
  if(fa[x] == x) return x;
  return fa[x] = getf(fa[x]);
}

int main() {
  scanf("%d", &n);
  int cur = 0;
  for(int i = 1; i <= n; ++ i)
    scanf("%d", &A[i]), ++ Map[A[i]], cur ^= A[i];
  A[n + 1] = cur;
  int now = 0;
  ++ Map[cur];
  for(int i = 1; i <= n; ++ i) {
    scanf("%d", &B[i]);
    now ^= B[i];
    -- Map[B[i]];
    if(Map[B[i]] < 0) {
      //assert(0);
      Exit;
    }
  }
  //throw;
  B[++ n] = now;
  for(int i = 1; i <= n; ++ i) if(A[i] != B[i] || i == n){
      fa[A[i]] = A[i];
      fa[B[i]] = B[i];
  }
  int tot = 0;
  for(int i = 1; i < n; ++ i) tot += (A[i] != B[i]);
  if(!tot) {
    puts("0");
    return 0;
  }
  for(int i = 1; i <= n; ++ i) {
    if(A[i] != B[i] || i == n) {
      fa[getf(A[i])] = getf(B[i]);
    }
  }
  //cerr << "HERE" << endl;
  set <int> S;
  for(int i = 1; i <= n; ++ i) {
    if(fa.count(A[i])) S.insert(getf(A[i]));
    if(fa.count(B[i])) S.insert(getf(B[i]));
  }
  tot += S.size();
  -- tot;
  cout << tot << endl;
}

### Prompt

Please provide a CPP coded solution to the problem described below:

There is a sequence of length N: a = (a_1, a_2, ..., a_N). Here, each a_i is a non-negative integer.

Snuke can repeatedly perform the following operation:

* Let the XOR of all the elements in a be x. Select an integer i (1 ≤ i ≤ N) and replace a_i with x.



Snuke's objective is to match a with another sequence b = (b_1, b_2, ..., b_N). Here, each b_i is a non-negative integer.

Determine whether the objective is achievable, and find the minimum necessary number of operations if the answer is positive.

Constraints

* 2 ≤ N ≤ 10^5
* a_i and b_i are integers.
* 0 ≤ a_i, b_i < 2^{30}

Input

Input is given from Standard Input in the following format:


N
a_1 a_2 ... a_N
b_1 b_2 ... b_N


Output

If the objective is achievable, print the minimum necessary number of operations. Otherwise, print `-1` instead.

Examples

Input

3
0 1 2
3 1 0


Output

2


Input

3
0 1 2
0 1 2


Output

0


Input

2
1 1
0 0


Output

-1


Input

4
0 1 2 3
1 0 3 2


Output

5

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

map <int, int> Map;
map <int, vector <int> > pos;

int n, m, x, y, A[N], B[N], C[N];

#define Exit exit(0 * puts("-1"))

map <int, int> fa;

int getf(int x) {
  if(fa[x] == x) return x;
  return fa[x] = getf(fa[x]);
}

int main() {
  scanf("%d", &n);
  int cur = 0;
  for(int i = 1; i <= n; ++ i)
    scanf("%d", &A[i]), ++ Map[A[i]], cur ^= A[i];
  A[n + 1] = cur;
  int now = 0;
  ++ Map[cur];
  for(int i = 1; i <= n; ++ i) {
    scanf("%d", &B[i]);
    now ^= B[i];
    -- Map[B[i]];
    if(Map[B[i]] < 0) {
      //assert(0);
      Exit;
    }
  }
  //throw;
  B[++ n] = now;
  for(int i = 1; i <= n; ++ i) if(A[i] != B[i] || i == n){
      fa[A[i]] = A[i];
      fa[B[i]] = B[i];
  }
  int tot = 0;
  for(int i = 1; i < n; ++ i) tot += (A[i] != B[i]);
  if(!tot) {
    puts("0");
    return 0;
  }
  for(int i = 1; i <= n; ++ i) {
    if(A[i] != B[i] || i == n) {
      fa[getf(A[i])] = getf(B[i]);
    }
  }
  //cerr << "HERE" << endl;
  set <int> S;
  for(int i = 1; i <= n; ++ i) {
    if(fa.count(A[i])) S.insert(getf(A[i]));
    if(fa.count(B[i])) S.insert(getf(B[i]));
  }
  tot += S.size();
  -- tot;
  cout << tot << endl;
}

```