Naman has two binary strings s and t of length n (a binary string is a string which only consists of the characters "0" and "1"). He wants to convert s into t using the following operation as few times as possible.

In one operation, he can choose any subsequence of s and rotate it clockwise once.

For example, if s = 1110100, he can choose a subsequence corresponding to indices (1-based) \{2, 6, 7 \} and rotate them clockwise. The resulting string would then be s = 1010110.

A string a is said to be a subsequence of string b if a can be obtained from b by deleting some characters without changing the ordering of the remaining characters.

To perform a clockwise rotation on a sequence c of size k is to perform an operation which sets c_1:=c_k, c_2:=c_1, c_3:=c_2, …, c_k:=c_{k-1} simultaneously.

Determine the minimum number of operations Naman has to perform to convert s into t or say that it is impossible. 

Input

The first line contains a single integer n (1 ≤ n ≤ 10^6) — the length of the strings.

The second line contains the binary string s of length n.

The third line contains the binary string t of length n.

Output

If it is impossible to convert s to t after any number of operations, print -1.

Otherwise, print the minimum number of operations required.

Examples

Input


6
010000
000001


Output


1

Input


10
1111100000
0000011111


Output


5

Input


8
10101010
01010101


Output


1

Input


10
1111100000
1111100001


Output


-1

Note

In the first test, Naman can choose the subsequence corresponding to indices \{2, 6\} and rotate it once to convert s into t.

In the second test, he can rotate the subsequence corresponding to all indices 5 times. It can be proved, that it is the minimum required number of operations.

In the last test, it is impossible to convert s into t.
#include <bits/stdc++.h>
using namespace std;
const long long int ll_MAX = 1e18 + 5;
const long long int MOD = 1e9 + 7;
long long int fast_expo(long long int x, long long int p) {
  if (p == 0)
    return 1;
  else if (p % 2 == 0) {
    long long int t = fast_expo(x, p / 2) % MOD;
    return (t * t) % MOD;
  } else
    return (x * (fast_expo(x, p - 1)) % MOD) % MOD;
}
long long int gcd(long long int a, long long int b) {
  if (a == 0 || b == 0)
    return a + b;
  else
    return gcd(b % a, a);
}
bool check(long long int arr[], long long int s, long long int e,
           long long int val, long long int num) {
  long long int cnt = 0;
  for (long long int i = s; i <= e; ++i) {
    if (arr[i] <= val) {
      cnt++;
      i++;
    }
  }
  if (cnt >= num) return true;
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  long long int t_c;
  t_c = 1;
  for (long long int t_i = 0; t_i < t_c; ++t_i) {
    long long int n;
    cin >> n;
    string s, t;
    cin >> s >> t;
    long long int cnt = 0;
    for (auto i : s) {
      if (i == '0') cnt++;
    }
    for (auto i : t) {
      if (i == '0') cnt--;
    }
    if (cnt != 0) {
      cout << -1;
      return 0;
    }
    string str;
    for (long long int i = 0; i < n; ++i) {
      if (s[i] != t[i]) {
        str.push_back(s[i]);
      }
    }
    if (str.size() == 0) {
      cout << 0;
      return 0;
    }
    long long int curr0 = 0, curr1 = 0;
    vector<long long int> vect;
    for (auto i : str) {
      if (i == '0') {
        curr0++;
        if (curr1 != 0) vect.push_back(curr1);
        curr1 = 0;
      } else {
        curr1++;
        if (curr0 != 0) vect.push_back(-curr0);
        curr0 = 0;
      }
    }
    if (curr1) vect.push_back(curr1);
    if (curr0) vect.push_back(-curr0);
    if (vect.size() == 0) {
      cout << 0 << "\n";
      return 0;
    }
    long long int ans = 0;
    vector<long long int> vect2;
    while (1) {
      ans++;
      if (vect[vect.size() - 1] * vect[0] < 0) {
        for (long long int i = 0; i < vect.size(); ++i) {
          if (vect[i] > 1) {
            if (vect2.size() > 0 && vect2[vect2.size() - 1] > 0) {
              long long int val = vect2[vect2.size() - 1];
              vect2.pop_back();
              vect2.push_back(val + vect[i] - 1);
            } else
              vect2.push_back(vect[i] - 1);
          } else if (vect[i] < -1) {
            if (vect2.size() > 0 && vect2[vect2.size() - 1] < 0) {
              long long int val = vect2[vect2.size() - 1];
              vect2.pop_back();
              vect2.push_back(val + vect[i] + 1);
            } else
              vect2.push_back(vect[i] + 1);
          }
        }
      } else {
        for (long long int i = 0; i < vect.size() - 1; ++i) {
          if (vect[i] > 1) {
            if (vect2.size() > 0 && vect2[vect2.size() - 1] > 0) {
              long long int val = vect2[vect2.size() - 1];
              vect2.pop_back();
              vect2.push_back(val + vect[i] - 1);
            } else
              vect2.push_back(vect[i] - 1);
          } else if (vect[i] < -1) {
            if (vect2.size() > 0 && vect2[vect2.size() - 1] < 0) {
              long long int val = vect2[vect2.size() - 1];
              vect2.pop_back();
              vect2.push_back(val + vect[i] + 1);
            } else
              vect2.push_back(vect[i] + 1);
          }
        }
        if (vect[vect.size() - 1] > 0) {
          if (vect2.size() > 0 && vect2[vect2.size() - 1] > 0) {
            long long int val = vect2[vect2.size() - 1];
            vect2.pop_back();
            vect2.push_back(val + vect[vect.size() - 1]);
          } else
            vect2.push_back(vect[vect.size() - 1]);
        } else if (vect[vect.size() - 1] < 0) {
          if (vect2.size() > 0 && vect2[vect2.size() - 1] < 0) {
            long long int val = vect2[vect2.size() - 1];
            vect2.pop_back();
            vect2.push_back(val + vect[vect.size() - 1]);
          } else
            vect2.push_back(vect[vect.size() - 1]);
        }
      }
      if (vect2.size() == 0) break;
      vect = vect2;
      vect2.clear();
    }
    cout << ans;
  }
  return 0;
}
