Problem:
Score : 1000 points

Problem Statement

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.

Sample Input 1

3
0 1 2
3 1 0

Sample Output 1

2

At first, the XOR of all the elements of a is 3.
If we replace a_1 with 3, a becomes (3, 1, 2).

Now, the XOR of all the elements of a is 0.
If we replace a_3 with 0, a becomes (3, 1, 0), which matches b.

Sample Input 2

3
0 1 2
0 1 2

Sample Output 2

0

Sample Input 3

2
1 1
0 0

Sample Output 3

-1

Sample Input 4

4
0 1 2 3
1 0 3 2

Sample Output 4

5

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
#define mid ((s + e) / 2)
#define makefast ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define comp(x, y) (lower_bound(vec.begin(), vec.end(), make_pair(x, y)) - vec.begin())
#define lc (v * 2)
#define rc (v * 2 + 1)
long long M = 1e9 + 7;
//>>>>>>>>>>>>>>>>>>>

const int N = 2e5 + 7;

map <int, int> mp;
vector <int> ad[N];
int dif[N], m;
int n, a[N], b[N];
int com;
bool mrk[N];

void dfs(int v) {
	mrk[v] = 1;
	for (auto u: ad[v])
		if (!mrk[u])
			dfs(u);
}
int cnt[N];
int main() {
	makefast;
	cin >> n;
	int x = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		x ^= a[i];
	}
	int res = 0;
	for (int i = 1; i <= n; i++) {
		cin >> b[i];
		if (!mp[b[i]]) {
			m++;
			mp[b[i]] = m;
		}
		if (!mp[a[i]]) {
			m++;
			mp[a[i]] = m;
		}
		a[i] = mp[a[i]];
		b[i] = mp[b[i]];
		cnt[a[i]]++;
		cnt[b[i]]--;
		if (a[i] != b[i]) {
			res++;
			dif[b[i]]++;
			dif[a[i]]--;
			ad[b[i]].push_back(a[i]);
			ad[a[i]].push_back(b[i]);
		}
	}
	if (res == 0) {
		cout << 0;
		return 0;
	}
	if (!mp[x]) {
		m++;
		mp[x] = m;
	}
	x = mp[x];
	cnt[x]++;
	for (int i = 1; i <= m; i++) {
		if (cnt[i] < 0) {
			cout << -1;
			return 0;	
		}
		if (!mrk[i] && ad[i].size()) {
			dfs(i);
			com++;
		}
	}
	if (dif[x] > 0)
		cout << com - 1 + res - 1;
	else
		cout << com - 1 + res;


}