#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<db,db> pdb;
typedef tuple<int,int,int,int> TP;
typedef vector<vector<ll>> mat;
const int N=1e5+5;
const ll mod=1e9+7;
int n,s[N],t[N],ans;
int s2[N],t2[N];
map<int,int> cnt1,cnt2,par;
int fi(int x)
{
	if(par[x]==x) return x;
	return par[x]=fi(par[x]);
}
void un(int x,int y)
{
	x=fi(x); y=fi(y);
	if(x!=y) par[y]=x;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++) cin>>t[i];
	for(int i=1;i<=n;i++){
		s[n+1]^=s[i];
		t[n+1]^=t[i];
	}
	for(int i=1;i<=n+1;i++) cnt1[s[i]]++;
	for(int i=1;i<=n+1;i++) cnt2[t[i]]++;
	for(int i=1;i<=n;i++) if(cnt2[t[i]]!=cnt1[t[i]]){
		cout<<-1;
		return 0;
	}
	bool ok=true;
	for(int i=1;i<=n+1;i++) if(s[i]!=t[i]) ok=false;
	if(ok){
		cout<<0;
		return 0;
	}
	for(int i=1;i<=n+1;i++){
		if(s[i]!=t[i]||i==n+1){
			if(i!=n+1) ans++;
			if(!par[s[i]]) par[s[i]]=s[i];
			if(!par[t[i]]) par[t[i]]=t[i];
			un(s[i],t[i]);
		}
	}
	for(auto &it : par) if(fi(it.fi)==it.fi) ans++;
	cout<<ans-1;
    return 0;
}
### Prompt

Construct a CPP code solution to the problem outlined:

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>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<db,db> pdb;
typedef tuple<int,int,int,int> TP;
typedef vector<vector<ll>> mat;
const int N=1e5+5;
const ll mod=1e9+7;
int n,s[N],t[N],ans;
int s2[N],t2[N];
map<int,int> cnt1,cnt2,par;
int fi(int x)
{
	if(par[x]==x) return x;
	return par[x]=fi(par[x]);
}
void un(int x,int y)
{
	x=fi(x); y=fi(y);
	if(x!=y) par[y]=x;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++) cin>>t[i];
	for(int i=1;i<=n;i++){
		s[n+1]^=s[i];
		t[n+1]^=t[i];
	}
	for(int i=1;i<=n+1;i++) cnt1[s[i]]++;
	for(int i=1;i<=n+1;i++) cnt2[t[i]]++;
	for(int i=1;i<=n;i++) if(cnt2[t[i]]!=cnt1[t[i]]){
		cout<<-1;
		return 0;
	}
	bool ok=true;
	for(int i=1;i<=n+1;i++) if(s[i]!=t[i]) ok=false;
	if(ok){
		cout<<0;
		return 0;
	}
	for(int i=1;i<=n+1;i++){
		if(s[i]!=t[i]||i==n+1){
			if(i!=n+1) ans++;
			if(!par[s[i]]) par[s[i]]=s[i];
			if(!par[t[i]]) par[t[i]]=t[i];
			un(s[i],t[i]);
		}
	}
	for(auto &it : par) if(fi(it.fi)==it.fi) ans++;
	cout<<ans-1;
    return 0;
}
```