#include<cstdio>
#include<algorithm>
inline void read(int&r)
{
	register char c;r=0;
	do c=getchar();while(c<'0'||c>'9');
	do r=r*10+c-'0',c=getchar();while(c>='0'&&c<='9');
}

int a[100000],b[100000],c[100001],d[100000];
int fa[100001];bool vis[100001];
int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); }
#define id(x) std::lower_bound(c,c+m,x)-c

int main()
{
	int i,j,n,m;read(n);
	for(i=0;i<n;i++)read(a[i]),c[i]=a[i],c[n]^=a[i];
	for(i=0;i<n;i++)read(b[i]),d[i]=b[i];
	int x=c[n];
	std::sort(c,c+n+1);
	std::sort(d,d+n);
	for(i=j=0;j<n;i++,j++)while(c[i]!=d[j])if(i==j)i++;else return puts("-1"),0;
	for(i=j=0;i<n;i++)j+=a[i]!=b[i];
	if(!j)return puts("0"),0;
	m=std::unique(c,c+n+1)-c,j--;
	for(i=0;i<m;i++)fa[i]=i;
	for(i=0;i<n;i++)fa[find(id(a[i]))]=find(id(b[i]));
	for(i=0;i<n;i++)if(a[i]!=b[i]&&!vis[find(id(a[i]))])vis[fa[id(a[i])]]=true,j++;
	if(!vis[find(id(x))])vis[fa[id(x)]]=true,j++;

	printf("%d\n",j);
}
### 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<cstdio>
#include<algorithm>
inline void read(int&r)
{
	register char c;r=0;
	do c=getchar();while(c<'0'||c>'9');
	do r=r*10+c-'0',c=getchar();while(c>='0'&&c<='9');
}

int a[100000],b[100000],c[100001],d[100000];
int fa[100001];bool vis[100001];
int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); }
#define id(x) std::lower_bound(c,c+m,x)-c

int main()
{
	int i,j,n,m;read(n);
	for(i=0;i<n;i++)read(a[i]),c[i]=a[i],c[n]^=a[i];
	for(i=0;i<n;i++)read(b[i]),d[i]=b[i];
	int x=c[n];
	std::sort(c,c+n+1);
	std::sort(d,d+n);
	for(i=j=0;j<n;i++,j++)while(c[i]!=d[j])if(i==j)i++;else return puts("-1"),0;
	for(i=j=0;i<n;i++)j+=a[i]!=b[i];
	if(!j)return puts("0"),0;
	m=std::unique(c,c+n+1)-c,j--;
	for(i=0;i<m;i++)fa[i]=i;
	for(i=0;i<n;i++)fa[find(id(a[i]))]=find(id(b[i]));
	for(i=0;i<n;i++)if(a[i]!=b[i]&&!vis[find(id(a[i]))])vis[fa[id(a[i])]]=true,j++;
	if(!vis[find(id(x))])vis[fa[id(x)]]=true,j++;

	printf("%d\n",j);
}
```