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;
#define int long long
signed main(){
  int n;
  cin>>n;
  int a[n],b[n];
  for(int i=0;i<n;i++) cin>>a[i];
  for(int i=0;i<n;i++) cin>>b[i];
  int x=0;
  for(int i=0;i<n;i++) x^=a[i];
  map<int,deque<int> > m;
  map<int,int> c;
  for(int i=0;i<n;i++){
    c[a[i]]++;c[b[i]]--;
    if(a[i]==b[i]) continue;
    m[b[i]].push_front(i);
  }

  int g=-1;
  c[x]++;
  for(auto p:c){
    if(p.second<0){
      cout<<-1<<endl;
      return 0;
    }
    if(p.second>0&&p.first==1) g=p.first;
  }
  
  int ans=0;
  while(!m.empty()){
    if(0){
      cout<<x<<":"<<endl;
      for(int i=0;i<n;i++) cout<<a[i]<<" ";cout<<endl;
      for(int i=0;i<n;i++) cout<<b[i]<<" ";cout<<endl;
      int w=0;
      for(int i=0;i<n;i++) w^=a[i];
      assert(w==x);
    }
    ans++;
    if(m.count(x)){
      int y=m[x].front();m[x].pop_front();
      if(m[x].empty()) m.erase(m.find(x));
      swap(x,a[y]);
    }else{
      int z=m.begin()->first;
      int y=m[z].front();
      if(y==g&&m.size()>1){
	z=(++m.begin())->first;
	y=m[z].front();
      }
      m[z].pop_front();
      if(m[z].empty()) m.erase(m.find(z));
      swap(x,a[y]);
      m[b[y]].push_back(y);
    }
  }
  
  //for(int i=0;i<n;i++) cout<<a[i]<<" ";cout<<endl;
  //for(int i=0;i<n;i++) cout<<b[i]<<" ";cout<<endl;
  for(int i=0;i<n;i++) assert(a[i]==b[i]);
  cout<<ans<<endl;
  return 0;
}