#include <bits/stdc++.h>

const int N = 100010;
std::multiset <int> a, b;
std::map <int, int> Hash;
int fa[N], numa[N], numb[N];
int n;

int find(int u){
	return u == fa[u] ? u : fa[u] = find(fa[u]);
}

void unite(int u, int v){
	int _u = find(u), _v = find(v);
	if (_u == _v){
		return;
	}
	fa[_u] = _v;
}

int main(){
	scanf("%d", &n);
	for (int i = 1; i <= n; ++ i){
		scanf("%d", &numa[i]);
		a.insert(numa[i]);
		numa[0] ^= numa[i];
	}
	for (int i = 1; i <= n; ++ i){
		scanf("%d", &numb[i]);
		b.insert(numb[i]);
		numb[0] ^= numb[i];
	}
	a.insert(numa[0]);
	b.insert(numb[0]);
	if (a != b){
		return printf("-1\n"), 0;
	}
	Hash[numa[0]] = Hash[numb[0]] = 0;
	for (int i = 1; i <= n; ++ i){
		if (numa[i] != numb[i]){
			Hash[numa[i]] = Hash[numb[i]] = 0;
		}
	}
	int cnt = 0;
	for (auto &u : Hash){
		u.second = cnt ++;
	}
	for (int i = 0; i < N; ++ i){
		fa[i] = i;
	}
	int ans = -1;
	for (int i = 1; i <= n; ++ i){
		if (numa[i] != numb[i]){
			unite(Hash[numa[i]], Hash[numb[i]]);
			++ ans;
		}
	}
	for (int i = 0; i < cnt; ++ i){
		find(i);
		if (fa[i] == i){
			++ ans;
		}
	}
	return printf("%d\n", ans), 0;
}
### Prompt

Your task is to create a CPP solution to the following problem:

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>

const int N = 100010;
std::multiset <int> a, b;
std::map <int, int> Hash;
int fa[N], numa[N], numb[N];
int n;

int find(int u){
	return u == fa[u] ? u : fa[u] = find(fa[u]);
}

void unite(int u, int v){
	int _u = find(u), _v = find(v);
	if (_u == _v){
		return;
	}
	fa[_u] = _v;
}

int main(){
	scanf("%d", &n);
	for (int i = 1; i <= n; ++ i){
		scanf("%d", &numa[i]);
		a.insert(numa[i]);
		numa[0] ^= numa[i];
	}
	for (int i = 1; i <= n; ++ i){
		scanf("%d", &numb[i]);
		b.insert(numb[i]);
		numb[0] ^= numb[i];
	}
	a.insert(numa[0]);
	b.insert(numb[0]);
	if (a != b){
		return printf("-1\n"), 0;
	}
	Hash[numa[0]] = Hash[numb[0]] = 0;
	for (int i = 1; i <= n; ++ i){
		if (numa[i] != numb[i]){
			Hash[numa[i]] = Hash[numb[i]] = 0;
		}
	}
	int cnt = 0;
	for (auto &u : Hash){
		u.second = cnt ++;
	}
	for (int i = 0; i < N; ++ i){
		fa[i] = i;
	}
	int ans = -1;
	for (int i = 1; i <= n; ++ i){
		if (numa[i] != numb[i]){
			unite(Hash[numa[i]], Hash[numb[i]]);
			++ ans;
		}
	}
	for (int i = 0; i < cnt; ++ i){
		find(i);
		if (fa[i] == i){
			++ ans;
		}
	}
	return printf("%d\n", ans), 0;
}
```