Problem:
Score : 1000 points

Problem Statement

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.

Sample Input 1

3
0 1 2
3 1 0

Sample Output 1

2

At first, the XOR of all the elements of a is 3.
If we replace a_1 with 3, a becomes (3, 1, 2).

Now, the XOR of all the elements of a is 0.
If we replace a_3 with 0, a becomes (3, 1, 0), which matches b.

Sample Input 2

3
0 1 2
0 1 2

Sample Output 2

0

Sample Input 3

2
1 1
0 0

Sample Output 3

-1

Sample Input 4

4
0 1 2 3
1 0 3 2

Sample Output 4

5

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<db,db> pdb;
typedef tuple<int,int,int,int> TP;
typedef vector<vector<ll>> mat;
const int N=1e5+5;
const ll mod=1e9+7;
int n,s[N],t[N],ans;
int s2[N],t2[N];
map<int,int> cnt1,cnt2,par;
int fi(int x)
{
	if(par[x]==x) return x;
	return par[x]=fi(par[x]);
}
void un(int x,int y)
{
	x=fi(x); y=fi(y);
	if(x!=y) par[y]=x;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++) cin>>t[i];
	for(int i=1;i<=n;i++){
		s[n+1]^=s[i];
		t[n+1]^=t[i];
	}
	for(int i=1;i<=n+1;i++){
		par[s[i]]=-1;
		par[t[i]]=-1;
	}
	for(int i=1;i<=n+1;i++) cnt1[s[i]]++;
	for(int i=1;i<=n+1;i++) cnt2[t[i]]++;
	for(int i=1;i<=n;i++) if(cnt2[t[i]]!=cnt1[t[i]]){
		cout<<-1;
		return 0;
	}
	bool ok=true;
	for(int i=1;i<=n+1;i++) if(s[i]!=t[i]) ok=false;
	if(ok){
		cout<<0;
		return 0;
	}
	for(int i=1;i<=n+1;i++){
		if(s[i]!=t[i]||i==n+1){
			if(i!=n+1) ans++;
			if(par[s[i]]==-1) par[s[i]]=s[i];
			if(par[t[i]]==-1) par[t[i]]=t[i];
			if(i!=n+1) un(s[i],t[i]);
		}
	}
	for(auto &it : par) if(fi(it.fi)==it.fi) ans++;
	cout<<ans-1;
    return 0;
}