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: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
const int MAXN=110100;
vector <int> v[MAXN];
int n,num,step,ans,a[MAXN],b[MAXN],c[MAXN*2+100],diff,has[MAXN],cnt[MAXN],now[MAXN],anss,cur[MAXN];
map<int,int> mapp;
int find(int x,int st,int z) {
	if (cur[x]==0){if (x==st)return 1; if (z)return 1; return 0;}
	cur[x]--;
	if (!find(v[x][cur[x]],st,z)) return 0;
	cnt[x]--;
	return 1;
}
bool comp(const int &a,const int &b){return a<b;}
int main() {
	//freopen("duliu.in","r",stdin);
	//freopen("duliu.out","w",stdout);
	scanf("%d",&n);
	for (int i=1; i<=n; ++i) {scanf("%d",&a[i]);c[i]=a[i];num^=a[i];}
	for (int i=1; i<=n; ++i) {scanf("%d",&b[i]);c[n+i]=b[i];}
	c[2*n+1]=num;
	sort(c+1,c+2+2*n,comp);
	for (int i=1; i<=2*n+1; ++i) if (c[i]!=c[i-1])mapp[c[i]]=mapp[c[i-1]]+1;
		else mapp[c[i]]=mapp[c[i-1]];
	for (int i=1; i<=n; ++i)
	if (a[i]!=b[i]){++ans;v[mapp[b[i]]].push_back(mapp[a[i]]);++cnt[mapp[b[i]]];}
	for (int i=1; i<=n; ++i) cur[mapp[b[i]]]=v[mapp[b[i]]].size();
	find(mapp[num],mapp[num],1);
	for (int i=1; i<=n; ++i){
		//printf("%d \n",cnt[mapp[b[i]]]);
		while (cnt[mapp[b[i]]]&&find(mapp[b[i]],mapp[b[i]],0)) ++anss;
		if (cnt[mapp[b[i]]]) {printf("-1");return 0;}
	}
	printf("%d",ans+anss);
}