#include <bits/stdc++.h>
using namespace std;

#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()

long long n,ans;
string s,t;
set<int> s1;
template<typename T>
void fin(T a){
  cout<<a<<endl;
  exit(0);
}
const int INF=1e9;
void f(int idx){
  if(idx==n-1)fin(-1);
  int p=*s1.upper_bound(idx);
  if(p==INF)fin(-1);
  ans+=p-idx;
  s[p]='0';
  s[idx]^=1;
  s1.erase(p);
}
/*
f(idx)はidxを変えたいからidxより大きくて最初の1に対して操作を行いたい訳で
0が続く場合はそこがガッと移動するから直近の1を移動させるイメージ
*/

int main(){
  cin>>n>>s>>t;
  REP(i,n)if(s[i]=='1')s1.insert(i);
  s1.insert(INF);
  REP(i,n-1)if(s[i]!=t[i])f(i);
  if(s!=t)fin(-1);
  cout<<ans<<endl;
}

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define mp make_pair
#define pb push_back

#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#define rep(i, n) for (int i = 0; i < (int)(n); ++ i)

int main() {
    int n;
    string s, t;
    cin >> n >> s >> t;
    vector <int> vs, vt;
    rep(i, n) if (s[i] == '1') vs.pb(i);
    rep(i, n) if (t[i] == '1') vt.pb(i);
    if (vs.size() < vt.size() || (vs.size() - vt.size()) % 2 == 1) {
        printf("-1\n");
        return 0;
    }
    ll ans = 0;
    int j = 0;
    rep(i, vs.size()) {
        if (j < vt.size() && vs[i] >= vt[j]) {
            ans += vs[i] - vt[j];
            ++ j;
        } else {
            if (i + 1 == vs.size()) {
                printf("-1\n");
                return 0;
            }
            ans += vs[i + 1] - vs[i];
            ++ i;
        }
    }
    if (j < vt.size()) {
        printf("-1\n");
        return 0;
    }
    cout << ans << endl;
    return 0;
}
