#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>

const int N = 1e5 + 51;

std::map<int, int> mp;
int sz;
int id(int x) {
	if (!mp.count(x)) return mp[x] = ++sz;
	return mp[x];
}

int p[N];
int f(int x) { return x[p] ? x[p] = f(x[p]) : x; }

int n, a[N], b[N], ans, fl = 1;
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", a + i), a[n + 1] ^= a[i];
	for (int i = 1; i <= n; i++) scanf("%d", b + i), b[n + 1] ^= b[i];
	for (int i = 1, x, y; i <= n; i++)
		if (a[i] != b[i]) {
			ans++;
			if ((x = f(id(a[i]))) != (y = f(id(b[i])))) x[p] = y;
			if (a[i] == a[n + 1] && fl) ans--, fl = 0;
			if (b[i] == b[n + 1] && fl) ans--, fl = 0;
			if (a[i] == b[n + 1] && fl) ans--, fl = 0;
			if (b[i] == a[n + 1] && fl) ans--, fl = 0;
		}
	std::sort(a + 1, a + n + 2);
	std::sort(b + 1, b + n + 2);
	for (int i = 1; i <= n + 1; i++)
		if (a[i] != b[i]) return puts("-1"), 0;
	for (int i = 1; i <= sz; i++) ans += !i[p];
	printf("%d", ans);
}

// ze
### 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 <algorithm>
#include <cstdio>
#include <cstring>
#include <map>

const int N = 1e5 + 51;

std::map<int, int> mp;
int sz;
int id(int x) {
	if (!mp.count(x)) return mp[x] = ++sz;
	return mp[x];
}

int p[N];
int f(int x) { return x[p] ? x[p] = f(x[p]) : x; }

int n, a[N], b[N], ans, fl = 1;
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", a + i), a[n + 1] ^= a[i];
	for (int i = 1; i <= n; i++) scanf("%d", b + i), b[n + 1] ^= b[i];
	for (int i = 1, x, y; i <= n; i++)
		if (a[i] != b[i]) {
			ans++;
			if ((x = f(id(a[i]))) != (y = f(id(b[i])))) x[p] = y;
			if (a[i] == a[n + 1] && fl) ans--, fl = 0;
			if (b[i] == b[n + 1] && fl) ans--, fl = 0;
			if (a[i] == b[n + 1] && fl) ans--, fl = 0;
			if (b[i] == a[n + 1] && fl) ans--, fl = 0;
		}
	std::sort(a + 1, a + n + 2);
	std::sort(b + 1, b + n + 2);
	for (int i = 1; i <= n + 1; i++)
		if (a[i] != b[i]) return puts("-1"), 0;
	for (int i = 1; i <= sz; i++) ans += !i[p];
	printf("%d", ans);
}

// ze
```