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++ (GCC 9.2.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int maxn=2e5+7;
vi G[maxn];
int fa[maxn];
int sz[maxn];
int Find(int x)
{
	return x==fa[x]?x:fa[x]=Find(fa[x]);
}
void Union(int x,int y)
{
	x=Find(x),y=Find(y);
	if(y!=x)
	{
		fa[y]=x;
		sz[x]+=sz[y];
	}
}
int main()
{
	for(int i=0;i<maxn;i++) sz[i]=1,fa[i]=i;
	int n;
	cin>>n;
	vi a(n),b(n);
	vi all;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		all.push_back(a[i]);
	}
	for(int i=0;i<n;i++)
	{
		cin>>b[i];
		all.push_back(b[i]);
	}
	int x=0;
	for(int i=0;i<n;i++) x^=a[i];
	all.push_back(x);
	sort(all.begin(),all.end());
	all.erase(unique(all.begin(),all.end()),all.end());
	auto getid=[&](int x){
		return lower_bound(all.begin(),all.end(),x)-all.begin();
	};
	map<int,int> cnt;
	for(auto u:b) cnt[u]++;
	int dif=0;
	for(auto u:a)
		cnt[u]--;
	cnt[x]--;
	for(auto u:cnt)
		dif+=abs(u.second);
	if(dif>1){
		cout<<-1<<'\n';
		return 0;
	}
	int tar=-1;
	for(auto u:cnt) if(u.second) tar=u.first;
	for(auto &u:a) u=getid(u);
	for(auto &u:b) u=getid(u);
	Union(getid(tar),getid(x));
	int ans=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]!=b[i]) ans++;
		Union(a[i],b[i]);
	}
	for(int i=0;i<maxn;i++)
	{
		if(Find(i)==i&&sz[Find(i)]!=1)
			ans++;
	}
	if(sz[Find(getid(x))]!=1) ans--;
	cout<<ans<<'\n';
}