#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
using namespace std;

const int N = 100 * 1000 + 5;

int a[N], b[N];
set <pair <int, int> > s;
map <int, set <int> > mp;
int c[N], d[N];
map <int, vector <int> > adj;
map <int, bool> mark;

void dfs(int v) {
	mark[v] = true;
	for (auto u : adj[v]) {
		if (!mark[u]) {
			dfs(u);
		}
	}
}


int main() {
	int n, ans = 0;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		a[0] ^= a[i];
	}
	for (int i = 1; i <= n; i++) {
		cin >> b[i];
		b[0] ^= b[i];
		if (a[i] != b[i]) {
			mp[b[i]].insert(i);
			s.insert({a[i], i});
		}
	}
	for (int i = 0; i <= n; i++) {
		c[i] = a[i];
		d[i] = b[i];
	}
	sort(c, c + n + 1);
	sort(d, d + n + 1);
	for (int i = 0; i <= n; i++) {
		if (c[i] != d[i]) {
			cout << -1;
			return 0;
		}
		if (a[i] != b[i]) {
			adj[i].push_back(a[i] + N);
			adj[i].push_back(b[i] + N);
			adj[a[i] + N].push_back(i);
			adj[b[i] + N].push_back(i);
			ans++;
		}
	}
	if (ans == 0) {
		cout << 0;
		return 0;
	}
	if (a[0] != b[0]) {
		ans -= 2;
	}
	else {
		if (adj[a[0] + N].size() != 0) {
			ans--;
		}
	}
	//cout << ans << endl;
	for (int i = 0; i <= n; i++) {
		if (a[i] != b[i] && !mark[i]) {
			dfs(i);
			ans++;
		}
	}
	cout << ans;
	return 0;
}
### Prompt

Please formulate 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 <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
using namespace std;

const int N = 100 * 1000 + 5;

int a[N], b[N];
set <pair <int, int> > s;
map <int, set <int> > mp;
int c[N], d[N];
map <int, vector <int> > adj;
map <int, bool> mark;

void dfs(int v) {
	mark[v] = true;
	for (auto u : adj[v]) {
		if (!mark[u]) {
			dfs(u);
		}
	}
}


int main() {
	int n, ans = 0;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		a[0] ^= a[i];
	}
	for (int i = 1; i <= n; i++) {
		cin >> b[i];
		b[0] ^= b[i];
		if (a[i] != b[i]) {
			mp[b[i]].insert(i);
			s.insert({a[i], i});
		}
	}
	for (int i = 0; i <= n; i++) {
		c[i] = a[i];
		d[i] = b[i];
	}
	sort(c, c + n + 1);
	sort(d, d + n + 1);
	for (int i = 0; i <= n; i++) {
		if (c[i] != d[i]) {
			cout << -1;
			return 0;
		}
		if (a[i] != b[i]) {
			adj[i].push_back(a[i] + N);
			adj[i].push_back(b[i] + N);
			adj[a[i] + N].push_back(i);
			adj[b[i] + N].push_back(i);
			ans++;
		}
	}
	if (ans == 0) {
		cout << 0;
		return 0;
	}
	if (a[0] != b[0]) {
		ans -= 2;
	}
	else {
		if (adj[a[0] + N].size() != 0) {
			ans--;
		}
	}
	//cout << ans << endl;
	for (int i = 0; i <= n; i++) {
		if (a[i] != b[i] && !mark[i]) {
			dfs(i);
			ans++;
		}
	}
	cout << ans;
	return 0;
}
```