#include <cstdio>
#include <algorithm>
#define rep(i, a, b) for (int i = a; i <= b; ++ i) 
const int N = 2e5 + 5 ;
using namespace std ;

int n, ans = 0, a[N], b[N], d[N], fa[N] ;

int find(int x) {
	int l = 1, r = d[0] ; 
	for ( ; l <= r ; ) {
		int mid = (l + r) / 2 ;
		if (d[mid] == x) return mid ;
		if (x < d[mid]) r = mid - 1 ; else l = mid + 1 ;
	}
	return 0 ;
}

int getfa(int x) {
	return (fa[x] == x ? x : fa[x] = getfa(fa[x])) ;
}

int main() {
	scanf("%d", &n) ;
	rep(i, 1, n) scanf("%d", &a[i]), a[0] ^= a[i] ;
	rep(i, 1, n) scanf("%d", &b[i]), b[0] ^= b[i] ;
	rep(i, 1, n) if (a[i] != b[i]) d[++ d[0]] = a[i], d[++ d[0]] = b[i] ;
	d[++ d[0]] = a[0], d[++ d[0]] = b[0] ;
	sort(d + 1, d + d[0] + 1) ;
	d[0] = unique(d + 1, d + d[0] + 1) - (d + 1) ;
	rep(i, 1, d[0]) fa[i] = i ;
	rep(i, 1, n) if (a[i] != b[i]) ++ ans, fa[getfa(find(a[i]))] = getfa(find(b[i])) ;
	sort(a, a + n + 1) ;
	sort(b, b + n + 1) ;
	rep(i, 0, n) if (a[i] != b[i]) {
		puts("-1") ;
		return 0 ;
	}
	rep(i, 1, d[0]) ans += getfa(i) == i ;
	printf("%d\n", ans - 1) ;
	return 0 ; 
}
### 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 <cstdio>
#include <algorithm>
#define rep(i, a, b) for (int i = a; i <= b; ++ i) 
const int N = 2e5 + 5 ;
using namespace std ;

int n, ans = 0, a[N], b[N], d[N], fa[N] ;

int find(int x) {
	int l = 1, r = d[0] ; 
	for ( ; l <= r ; ) {
		int mid = (l + r) / 2 ;
		if (d[mid] == x) return mid ;
		if (x < d[mid]) r = mid - 1 ; else l = mid + 1 ;
	}
	return 0 ;
}

int getfa(int x) {
	return (fa[x] == x ? x : fa[x] = getfa(fa[x])) ;
}

int main() {
	scanf("%d", &n) ;
	rep(i, 1, n) scanf("%d", &a[i]), a[0] ^= a[i] ;
	rep(i, 1, n) scanf("%d", &b[i]), b[0] ^= b[i] ;
	rep(i, 1, n) if (a[i] != b[i]) d[++ d[0]] = a[i], d[++ d[0]] = b[i] ;
	d[++ d[0]] = a[0], d[++ d[0]] = b[0] ;
	sort(d + 1, d + d[0] + 1) ;
	d[0] = unique(d + 1, d + d[0] + 1) - (d + 1) ;
	rep(i, 1, d[0]) fa[i] = i ;
	rep(i, 1, n) if (a[i] != b[i]) ++ ans, fa[getfa(find(a[i]))] = getfa(find(b[i])) ;
	sort(a, a + n + 1) ;
	sort(b, b + n + 1) ;
	rep(i, 0, n) if (a[i] != b[i]) {
		puts("-1") ;
		return 0 ;
	}
	rep(i, 1, d[0]) ans += getfa(i) == i ;
	printf("%d\n", ans - 1) ;
	return 0 ; 
}
```