#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map> 
using namespace std;
int n,A[110000],B[110000],len,in[210000],ou[210000],w[210000],father[210000];
map<int,int>M;
int findfather(int k1){
	if (father[k1]==k1) return k1; return father[k1]=findfather(father[k1]);
}
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&A[i]);
	for (int i=1;i<=n;i++) scanf("%d",&B[i]);
	int tot=0;
	for (int i=1;i<=n;i++)
		if (A[i]!=B[i]){
			if (M[A[i]]==0) M[A[i]]=++len,w[len]=A[i];
			if (M[B[i]]==0) M[B[i]]=++len,w[len]=B[i];
			tot++; ou[M[A[i]]]++; in[M[B[i]]]++;
		}
	int where=0;
	for (int i=1;i<=len;i++)
		if (in[i]>ou[i]){
			if (where||in[i]>ou[i]+1){
				printf("-1\n"); return 0;
			}
			where=i;
		}
	int pre=0;
	for (int i=1;i<=n;i++) pre^=A[i];
	if (where&&pre!=w[where]){
		printf("-1\n"); return 0;
	}
	if (where==0&&M[pre]) where=M[pre];
	for (int i=1;i<=len;i++) father[i]=i;
	int num=len;
	for (int i=1;i<=n;i++)
		if (A[i]!=B[i]){
			int k1=M[A[i]],k2=M[B[i]];
			if (findfather(k1)!=findfather(k2)){
				num--; father[findfather(k1)]=findfather(k2);
			}
		}
	int ans=tot+num-(where>0);
	cout<<ans<<endl;
	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<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map> 
using namespace std;
int n,A[110000],B[110000],len,in[210000],ou[210000],w[210000],father[210000];
map<int,int>M;
int findfather(int k1){
	if (father[k1]==k1) return k1; return father[k1]=findfather(father[k1]);
}
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&A[i]);
	for (int i=1;i<=n;i++) scanf("%d",&B[i]);
	int tot=0;
	for (int i=1;i<=n;i++)
		if (A[i]!=B[i]){
			if (M[A[i]]==0) M[A[i]]=++len,w[len]=A[i];
			if (M[B[i]]==0) M[B[i]]=++len,w[len]=B[i];
			tot++; ou[M[A[i]]]++; in[M[B[i]]]++;
		}
	int where=0;
	for (int i=1;i<=len;i++)
		if (in[i]>ou[i]){
			if (where||in[i]>ou[i]+1){
				printf("-1\n"); return 0;
			}
			where=i;
		}
	int pre=0;
	for (int i=1;i<=n;i++) pre^=A[i];
	if (where&&pre!=w[where]){
		printf("-1\n"); return 0;
	}
	if (where==0&&M[pre]) where=M[pre];
	for (int i=1;i<=len;i++) father[i]=i;
	int num=len;
	for (int i=1;i<=n;i++)
		if (A[i]!=B[i]){
			int k1=M[A[i]],k2=M[B[i]];
			if (findfather(k1)!=findfather(k2)){
				num--; father[findfather(k1)]=findfather(k2);
			}
		}
	int ans=tot+num-(where>0);
	cout<<ans<<endl;
	return 0;
}
```