#include <iostream>
#include <fstream>
#include <map>
#include <vector>
using namespace std;
const int nmax=100005;
map<int,int> ap,norm;
vector<int> v[nmax];
int viz[nmax],a[nmax],b[nmax];
int n,i,j,nr,edges,cc;
void dfs(int x)
{
    viz[x]=1;
    for(int i=0;i<v[x].size();i++)
        if(!viz[v[x][i]])
           dfs(v[x][i]);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i],a[0]^=a[i];
    for(j=1;j<=n;j++)
        cin>>b[j],b[0]^=b[j];
    for(i=0;i<=n;i++)
        ap[a[i]]++;
    for(i=0;i<=n;i++)
        ap[b[i]]--;
    for(i=0;i<=n;i++)
        if(ap[a[i]]||ap[b[i]])
    {
        cout<<"-1";
        return 0;
    }
    for(i=0;i<=n;i++)
        if((!norm[a[i]])&&(a[i]!=b[i]||i==0))
          norm[a[i]]=++nr;
    if(!norm[b[0]])
        norm[b[0]]=++nr;
    for(i=1;i<=n;i++)
        if((a[i]!=b[i]))
    {
        a[i]=norm[a[i]];
        b[i]=norm[b[i]];
        v[a[i]].push_back(b[i]);
        v[b[i]].push_back(a[i]);
        edges++;
    }
    for(int i=1;i<=nr;i++)
        if((!viz[i]))
          dfs(i),cc++;
    cout<<edges+cc-1<<'\n';
    return 0;
}

### Prompt

In cpp, your task is to solve the following problem:

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.

Examples

Input

3
0 1 2
3 1 0


Output

2


Input

3
0 1 2
0 1 2


Output

0


Input

2
1 1
0 0


Output

-1


Input

4
0 1 2 3
1 0 3 2


Output

5

### Response

```cpp
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
using namespace std;
const int nmax=100005;
map<int,int> ap,norm;
vector<int> v[nmax];
int viz[nmax],a[nmax],b[nmax];
int n,i,j,nr,edges,cc;
void dfs(int x)
{
    viz[x]=1;
    for(int i=0;i<v[x].size();i++)
        if(!viz[v[x][i]])
           dfs(v[x][i]);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i],a[0]^=a[i];
    for(j=1;j<=n;j++)
        cin>>b[j],b[0]^=b[j];
    for(i=0;i<=n;i++)
        ap[a[i]]++;
    for(i=0;i<=n;i++)
        ap[b[i]]--;
    for(i=0;i<=n;i++)
        if(ap[a[i]]||ap[b[i]])
    {
        cout<<"-1";
        return 0;
    }
    for(i=0;i<=n;i++)
        if((!norm[a[i]])&&(a[i]!=b[i]||i==0))
          norm[a[i]]=++nr;
    if(!norm[b[0]])
        norm[b[0]]=++nr;
    for(i=1;i<=n;i++)
        if((a[i]!=b[i]))
    {
        a[i]=norm[a[i]];
        b[i]=norm[b[i]];
        v[a[i]].push_back(b[i]);
        v[b[i]].push_back(a[i]);
        edges++;
    }
    for(int i=1;i<=nr;i++)
        if((!viz[i]))
          dfs(i),cc++;
    cout<<edges+cc-1<<'\n';
    return 0;
}

```