#include<bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int maxn=2e5+7;
vi G[maxn];
int fa[maxn];
int sz[maxn];
int Find(int x)
{
	return x==fa[x]?x:fa[x]=Find(fa[x]);
}
void Union(int x,int y)
{
	x=Find(x),y=Find(y);
	if(y!=x)
	{
		fa[y]=x;
		sz[x]+=sz[y];
	}
}
int main()
{
	for(int i=0;i<maxn;i++) sz[i]=1,fa[i]=i;
	int n;
	cin>>n;
	vi a(n),b(n);
	vi all;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		all.push_back(a[i]);
	}
	for(int i=0;i<n;i++)
	{
		cin>>b[i];
		all.push_back(b[i]);
	}
	int x=0;
	for(int i=0;i<n;i++) x^=a[i];
	all.push_back(x);
	sort(all.begin(),all.end());
	all.erase(unique(all.begin(),all.end()),all.end());
	auto getid=[&](int x){
		return lower_bound(all.begin(),all.end(),x)-all.begin();
	};
	map<int,int> cnt;
	for(auto u:b) cnt[u]++;
	int dif=0;
	for(auto u:a)
		cnt[u]--;
	cnt[x]--;
	for(auto u:cnt)
		dif+=abs(u.second);
	if(dif>1){
		cout<<-1<<'\n';
		return 0;
	}
	int tar=-1;
	for(auto u:cnt) if(u.second) tar=u.first;
	for(auto &u:a) u=getid(u);
	for(auto &u:b) u=getid(u);
	Union(getid(tar),getid(x));
	int ans=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]!=b[i]) ans++;
		Union(a[i],b[i]);
	}
	for(int i=0;i<maxn;i++)
	{
		if(Find(i)==i&&sz[Find(i)]!=1)
			ans++;
	}
	if(sz[Find(getid(x))]!=1) ans--;
	cout<<ans<<'\n';
}

### 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>
using namespace std;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int maxn=2e5+7;
vi G[maxn];
int fa[maxn];
int sz[maxn];
int Find(int x)
{
	return x==fa[x]?x:fa[x]=Find(fa[x]);
}
void Union(int x,int y)
{
	x=Find(x),y=Find(y);
	if(y!=x)
	{
		fa[y]=x;
		sz[x]+=sz[y];
	}
}
int main()
{
	for(int i=0;i<maxn;i++) sz[i]=1,fa[i]=i;
	int n;
	cin>>n;
	vi a(n),b(n);
	vi all;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		all.push_back(a[i]);
	}
	for(int i=0;i<n;i++)
	{
		cin>>b[i];
		all.push_back(b[i]);
	}
	int x=0;
	for(int i=0;i<n;i++) x^=a[i];
	all.push_back(x);
	sort(all.begin(),all.end());
	all.erase(unique(all.begin(),all.end()),all.end());
	auto getid=[&](int x){
		return lower_bound(all.begin(),all.end(),x)-all.begin();
	};
	map<int,int> cnt;
	for(auto u:b) cnt[u]++;
	int dif=0;
	for(auto u:a)
		cnt[u]--;
	cnt[x]--;
	for(auto u:cnt)
		dif+=abs(u.second);
	if(dif>1){
		cout<<-1<<'\n';
		return 0;
	}
	int tar=-1;
	for(auto u:cnt) if(u.second) tar=u.first;
	for(auto &u:a) u=getid(u);
	for(auto &u:b) u=getid(u);
	Union(getid(tar),getid(x));
	int ans=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]!=b[i]) ans++;
		Union(a[i],b[i]);
	}
	for(int i=0;i<maxn;i++)
	{
		if(Find(i)==i&&sz[Find(i)]!=1)
			ans++;
	}
	if(sz[Find(getid(x))]!=1) ans--;
	cout<<ans<<'\n';
}

```