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>
#define N 100005
using namespace std;
map<int,int>mp,s;
int n,a[N],b[N],cnt;
int f[N],siz[N],ss[N];
int find(int x)
{
    if(x==f[x])return x;
    return f[x]=find(f[x]);
}
void add(int a,int b)
{
    int aa=find(a),bb=find(b);
    if(aa!=bb)
    {
        f[aa]=bb;
        siz[bb]+=siz[aa];
        ss[bb]+=ss[aa];
    }ss[bb]++;
}
int main()
{
    scanf("%d",&n);int sum=0,fl=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum^=a[i];
        mp[a[i]]++;
    }
    //cout<<sum<<endl;
    for(int i=1;i<=n;i++)
    {
       // if(sum==a[i]&&mp[a[i]]==1)continue;
        if(s[a[i]]!=0)continue;
        s[a[i]]=++cnt;f[cnt]=cnt;siz[cnt]=mp[a[i]];
    }
    if(mp.find(sum)!=mp.end())mp[sum]++;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&b[i]);
        if(b[i]==a[i])siz[find(s[a[i]])]--;
        if(mp.find(b[i])==mp.end())
        {
            if(!fl&&b[i]==sum)fl=1;
            else return puts("-1"),0;
        }
        else
        {
            //cout<<mp[b[i]]<<endl;
            if(!fl&&b[i]==sum)fl=1;
            else if(mp[b[i]]==0)return puts("-1"),0;
            if(mp[b[i]]!=0)mp[b[i]]--,add(s[b[i]],s[a[i]]);
        }
    }
    int ans=0;
    for(int i=1;i<=cnt;i++)
    {
        if(find(i)==i)
        {
            if(siz[i]==0)continue;
            ans+=siz[i]+1;
        }
    }
    if(fl)ans--;if(!ans)ans++;
    cout<<ans<<endl;
    return 0;
}