#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i = a; i < (b); ++i)
#define rrep(i,a,b) for(int i = b; i --> (a);)
#define all(v) v.begin(),v.end()
#define trav(x,v) for(auto &x : v)
#define sz(v) (int)(v).size()
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;

struct UF {
	vi t;
	UF(int n){
		t.resize(n, -1);
	}
	int find(int a){
		return t[a]<0 ? a : t[a] = find(t[a]);
	}
	bool uni(int a, int b){
		a = find(a), b = find(b);
		if(a == b) return 0;
		if(t[a] < t[b]) swap(a,b);
		t[b] += t[a];
		t[a] = b;
		return 1;
	}
};

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	int n;
	cin >> n;
	vi as(n), bs(n);
	trav(a, as) cin >> a;
	trav(b, bs) cin >> b;
	int x = 0;
	trav(a, as) x ^= a;
	as.push_back(x);
	x = 0;
	trav(b, bs) x ^= b;
	bs.push_back(x);
	vi s = as, t = bs;
	sort(all(s)), sort(all(t));
	if(s != t){
		cout << -1 << endl;
		return 0;
	}
	int ans = 0;
	rep(i,0,n) ans += as[i] != bs[i];

	map<int,int> ren;
	trav(x, as) ren[x] = 0;
	int ix = 0;
	trav(pa, ren) pa.second = ix++;
	ans += ix-1;
	UF uf(ix);
	rep(i,0,n) ans -= uf.uni(ren[as[i]], ren[bs[i]]);
	rep(i,0,ix) if(i != ren[as.back()] && uf.t[i] == -1) --ans;
	cout << ans << endl;
}
### 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 <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i = a; i < (b); ++i)
#define rrep(i,a,b) for(int i = b; i --> (a);)
#define all(v) v.begin(),v.end()
#define trav(x,v) for(auto &x : v)
#define sz(v) (int)(v).size()
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;

struct UF {
	vi t;
	UF(int n){
		t.resize(n, -1);
	}
	int find(int a){
		return t[a]<0 ? a : t[a] = find(t[a]);
	}
	bool uni(int a, int b){
		a = find(a), b = find(b);
		if(a == b) return 0;
		if(t[a] < t[b]) swap(a,b);
		t[b] += t[a];
		t[a] = b;
		return 1;
	}
};

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	int n;
	cin >> n;
	vi as(n), bs(n);
	trav(a, as) cin >> a;
	trav(b, bs) cin >> b;
	int x = 0;
	trav(a, as) x ^= a;
	as.push_back(x);
	x = 0;
	trav(b, bs) x ^= b;
	bs.push_back(x);
	vi s = as, t = bs;
	sort(all(s)), sort(all(t));
	if(s != t){
		cout << -1 << endl;
		return 0;
	}
	int ans = 0;
	rep(i,0,n) ans += as[i] != bs[i];

	map<int,int> ren;
	trav(x, as) ren[x] = 0;
	int ix = 0;
	trav(pa, ren) pa.second = ix++;
	ans += ix-1;
	UF uf(ix);
	rep(i,0,n) ans -= uf.uni(ren[as[i]], ren[bs[i]]);
	rep(i,0,ix) if(i != ren[as.back()] && uf.t[i] == -1) --ans;
	cout << ans << endl;
}
```