#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
int n,a[maxn],b[maxn],ta[maxn],tb[maxn],vis[maxn];
map<int,int> Ha; int tot=0;
int fa[maxn];
int getf(int x){return fa[x]==x?x:fa[x]=getf(fa[x]);}
int Merge(int x,int y)
{
	int fx=getf(x),fy=getf(y);
	if(fx!=fy) fa[fx]=fy;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;ta[i]=a[i],i++)
	{
		if(i!=n+1) scanf("%d",&a[i]),a[n+1]^=a[i];
		if(!Ha[a[i]]) Ha[a[i]]=++tot;
	}
	for(int i=1;i<=n+1;tb[i]=b[i],i++)
	{
		if(i!=n+1)scanf("%d",&b[i]),b[n+1]^=b[i];
		if(!Ha[b[i]]) Ha[b[i]]=++tot;
	}
	n++;
	sort(ta+1,ta+n+1),sort(tb+1,tb+n+1);
	for(int i=1;i<=n;i++)
		if(ta[i]!=tb[i]) return (puts("-1"),0);
	for(int i=1;i<=2*n+tot;i++) fa[i]=i;
	for(int i=1;i<=n;i++)
	{
		if(a[i]==b[i]&&i!=n) continue;
		Merge(i,i+n),Merge(i,2*n+Ha[a[i]]),Merge(i+n,2*n+Ha[b[i]]);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]==b[i]&&i!=n) continue;
		if(i!=n) ans++;
		ans+=!(vis[getf(i)]),vis[getf(i)]=1;
		ans+=!(vis[getf(i+n)]),vis[getf(i+n)]=1;
	}
	printf("%d\n",ans-1);
	return 0;
}
### Prompt

Please create a solution in CPP 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>
#define maxn 1000005
using namespace std;
int n,a[maxn],b[maxn],ta[maxn],tb[maxn],vis[maxn];
map<int,int> Ha; int tot=0;
int fa[maxn];
int getf(int x){return fa[x]==x?x:fa[x]=getf(fa[x]);}
int Merge(int x,int y)
{
	int fx=getf(x),fy=getf(y);
	if(fx!=fy) fa[fx]=fy;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;ta[i]=a[i],i++)
	{
		if(i!=n+1) scanf("%d",&a[i]),a[n+1]^=a[i];
		if(!Ha[a[i]]) Ha[a[i]]=++tot;
	}
	for(int i=1;i<=n+1;tb[i]=b[i],i++)
	{
		if(i!=n+1)scanf("%d",&b[i]),b[n+1]^=b[i];
		if(!Ha[b[i]]) Ha[b[i]]=++tot;
	}
	n++;
	sort(ta+1,ta+n+1),sort(tb+1,tb+n+1);
	for(int i=1;i<=n;i++)
		if(ta[i]!=tb[i]) return (puts("-1"),0);
	for(int i=1;i<=2*n+tot;i++) fa[i]=i;
	for(int i=1;i<=n;i++)
	{
		if(a[i]==b[i]&&i!=n) continue;
		Merge(i,i+n),Merge(i,2*n+Ha[a[i]]),Merge(i+n,2*n+Ha[b[i]]);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]==b[i]&&i!=n) continue;
		if(i!=n) ans++;
		ans+=!(vis[getf(i)]),vis[getf(i)]=1;
		ans+=!(vis[getf(i+n)]),vis[getf(i+n)]=1;
	}
	printf("%d\n",ans-1);
	return 0;
}
```