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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
class Solve{
    long[] Numbers;
    public Solve(){}
    StringBuilder sb;
    public static int Main(){
        new Solve().Run();
        return 0;
    }
    void Run(){
        sb = new StringBuilder();
        Calc();
        Console.Write(sb.ToString());
    }
    void Calc(){
        int N = int.Parse(Console.ReadLine());
        string[] str = Console.ReadLine().Split(' ');
        long[] A = new long[N+1];
        {
            long xor = 0;
            for(int i=0;i<N;i++){
                A[i] = int.Parse(str[i]);
                xor ^= A[i];
            }
            A[N] = xor;
        }
        str = Console.ReadLine().Split(' ');
        long[] B = new long[N+1];
        {
            long xor = 0;
            for(int i=0;i<N;i++){
                B[i] = int.Parse(str[i]);
                xor ^= B[i];
            }
            B[N] = xor;
        }
        {
            long[] C = new long[N+1];
            long[] D = new long[N+1];
            for(int i=0;i<=N;i++){
                C[i] = A[i];
                D[i] = B[i];
            }
            Array.Sort(C);
            Array.Sort(D);
            bool b = true;
            for(int i=0;i<N;i++){
                b &= C[i] == D[i];
            }
            if(!b){
                sb.Append("-1\n");
                return;
            }
            List<long> numbers = new List<long>();
            for(int i=0;i<=N;i++){
                if(i == 0 || C[i] != C[i-1]){
                    numbers.Add(C[i]);
                }
            }
            Numbers = numbers.ToArray();
        }
        int S = Numbers.Length;
        UnionFind U = new UnionFind(S);
        int count = 0;
        for(int i=0;i<=N;i++){
            if(A[i] != B[i]){
                count++;
                U.Union(ToIndex(A[i]),ToIndex(B[i]));
            }
        }
        int[] UC = new int[S];
        for(int i=0;i<S;i++){
            UC[U.Get(i)]++;
            if(UC[U.Get(i)] == 2){
                count++;
            }
        }
        if(A[N] != B[N]){
            count -= 2;
        }
        else if(UC[U.Get(ToIndex(A[N]))] >= 2){
            count--;
        }
        sb.Append(count+"\n");
    }
    int ToIndex(long X){
        int bf = 0;
        int bl = Numbers.Length-1;
        while(bf != bl){
            int bc = (bf+bl)/2;
            if(X <= Numbers[bc]){
                bl = bc;
            }
            else{
                bf = bc+1;
            }
        }
        return bf;
    }
}
class UnionFind{
    int[] par;
    public UnionFind(int n){
        par = new int[n];
        for(int i=0;i<n;i++){
            par[i] = i;
        }
    }
    public void Union(int x,int y){
        par[Get(x)] = Get(y); 
    }
    public bool Same(int x,int y){
        return Get(x) == Get(y);
    }
    public int Get(int x){
        if(x != par[x]){
            par[x] = Get(par[x]);
        }
        return par[x];
    }
}