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;
#define erorp(x) cout<<#x<<"={"<<(x.F)<<" , "<<x.S<<"}"<<endl;
#define print(v,r) f(i,0,r) cout<<v[i]<<" "; cout<<endl;
#define is_bit(x,y) (x%(1<<(y+1))>=(1<<y))
#define eror(x) cout<<#x<<'='<<(x)<<endl;
#define f_(i,a,b) for(int i=a;i>=b;i--)
#define Gett(x,y) scanf("%d%d",&x,&y);
#define f(i,a,b) for(int i=a;i<b;i++)
#define get(x) scanf("%I64d",&x);
#define All(x) x.begin(),x.end()
#define gett(x) scanf("%d",&x);
#define Add(x,y) x=(x+y)%mod
#define maxm(a,b) a=max(a,b)
#define minm(a,b) a=min(a,b)
#define lst(x) x[x.size()-1]
#define sz(x) int(x.size())
#define mp make_pair
#define ll long long
#define pb push_back
#define S second
#define F first

const int N=1e5+99;

int n,c,x,mv,ans,res,a[N],b[N],mark[N];
map<int,int> t,tn;
vector<int> g[N];

void dfs(int x){
    mark[x]=1;
    f(i,0,g[x].size())
        if(!mark[g[x][i]])
            dfs(g[x][i]);
    ans+=g[x].size();
}

int main(){
    cin>>n;
    f(i,1,n+1){
        gett(a[i]);
        a[0]^=a[i];
        t[a[i]]++;
    }
    t[a[0]]++;
    f(i,1,n+1){  
        gett(b[i]);
        b[0]^=b[i];
    }
    f(i,0,n+1){
        t[b[i]]--;
        if(t[b[i]]<0)
            return cout<<-1,0;
    }
    f(i,0,n+1){
        if(!tn[a[i]]){
            c++;
            tn[a[i]]=c;
        }
    }
    f(i,0,n+1){
        a[i]=tn[a[i]];
        b[i]=tn[b[i]];
        if(a[i]!=b[i]) g[a[i]].pb(b[i]);
    }
    f(i,1,n+1)
        if(b[i]==a[0] && b[0]==a[0])
            mv=1;
    f(i,1,n+2)
        if(!mark[i] && sz(g[i])){
            res++;
            dfs(i);
        }
    if(ans==0) return cout<<0,0;
    cout<<ans+res-(a[0]!=b[0])*2-mv;
}