#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>

#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)

using namespace std;
typedef long long ll;
const ll N=12e4;

int a[N],b[N],aa[N],bb[N];
int n,m,hs,ans;
int fa[N];

map<int,int> s;

inline int get(int o)
{return (fa[o]==o)?o:(fa[o]=get(fa[o]));}

int main()
{
	cin>>n;
	fo(i,1,n)scanf("%d",&a[i]),a[n+1]^=a[i];
	fo(i,1,n)scanf("%d",&b[i]),b[n+1]^=b[i];
	++n;
	fo(i,1,n)aa[i]=a[i],bb[i]=b[i];
	sort(aa+1,aa+n+1); sort(bb+1,bb+n+1);
	fo(i,1,n)if(aa[i]!=bb[i]){
		puts("-1");
		return 0;
	}
	int p=0;
	aa[0]=-1;
	fo(i,1,n)if(aa[i]!=aa[i-1]){
		++p;
		s[aa[i]]=p;
	}
	fo(i,1,n)a[i]=s[a[i]];
	fo(i,1,n)b[i]=s[b[i]];
	fo(i,1,n)if(a[i]!=b[i])fa[a[i]]=a[i],fa[b[i]]=b[i],ans=ans+1;
	fo(i,1,n)if(a[i]!=b[i])fa[get(a[i])]=get(b[i]);
	fo(i,1,p)if(!fa[i])fa[i]=get(i);
	fo(i,1,p)if(fa[i]==i)++ans;
	if(a[n]!=b[n])ans-=2;
	else if(fa[a[n]]!=0)--ans;
	if(ans<0)ans=0;
	cout<<ans;
}
### Prompt

Generate a CPP solution 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<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>

#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)

using namespace std;
typedef long long ll;
const ll N=12e4;

int a[N],b[N],aa[N],bb[N];
int n,m,hs,ans;
int fa[N];

map<int,int> s;

inline int get(int o)
{return (fa[o]==o)?o:(fa[o]=get(fa[o]));}

int main()
{
	cin>>n;
	fo(i,1,n)scanf("%d",&a[i]),a[n+1]^=a[i];
	fo(i,1,n)scanf("%d",&b[i]),b[n+1]^=b[i];
	++n;
	fo(i,1,n)aa[i]=a[i],bb[i]=b[i];
	sort(aa+1,aa+n+1); sort(bb+1,bb+n+1);
	fo(i,1,n)if(aa[i]!=bb[i]){
		puts("-1");
		return 0;
	}
	int p=0;
	aa[0]=-1;
	fo(i,1,n)if(aa[i]!=aa[i-1]){
		++p;
		s[aa[i]]=p;
	}
	fo(i,1,n)a[i]=s[a[i]];
	fo(i,1,n)b[i]=s[b[i]];
	fo(i,1,n)if(a[i]!=b[i])fa[a[i]]=a[i],fa[b[i]]=b[i],ans=ans+1;
	fo(i,1,n)if(a[i]!=b[i])fa[get(a[i])]=get(b[i]);
	fo(i,1,p)if(!fa[i])fa[i]=get(i);
	fo(i,1,p)if(fa[i]==i)++ans;
	if(a[n]!=b[n])ans-=2;
	else if(fa[a[n]]!=0)--ans;
	if(ans<0)ans=0;
	cout<<ans;
}
```