/*
{
######################
#       Author       #
#        Gary        #
#        2020        #
######################
*/
//#pragma GCC target ("avx2")
//#pragma GCC optimization ("O3")
//#pragma GCC optimization ("unroll-loops")
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){
//    int x=0;
//    char ch=getchar();
//    while(ch<'0'||ch>'9'){
//        ch=getchar();
//    }
//    while(ch>='0'&&ch<='9'){
//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
int n;
int main(){
	cin>>n;
	string s,t;
	cin>>s>>t;
	LL rest=0;
	stack<int> sta; 
	rl(i,n-1,0){
		if(s[i]=='1'){
			sta.push(i);
		}
		if(t[i]=='1'){
			if(sta.empty()){
				cout<<-1<<endl;;
				return 0;
			}	
			if(sta.size()%2==0){
				int t=sta.top();
				sta.pop();
				rest+=sta.top()-i;
				sta.pop();
				sta.push(t);
			}
			else{
				rest+=sta.top()-i;
				sta.pop();
			}
		}
	}
	if(sta.size()&1){
		cout<<-1<<endl;
	}
	else{
		while(!sta.empty()){
			int a,b;
			a=sta.top();sta.pop();
			b=sta.top();	sta.pop();
			rest+=b-a;
		}
		cout<<rest<<endl;
	}
	return 0;
}
/** 程序框架：
  *
  *
  *
  *
  **/


#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rrep(i, n) for (int i = 1; i < (int)(n+1); ++i)
const int MAX = 510000;
const long long INF = 1LL<<60;
const int MOD = 10007;
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("Ofast")
//二項係数ライブラリ
long long fac[MAX], finv[MAX], inv[MAX];
// テーブルを作る前処理
void COMinit() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++) {
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}
// 二項係数計算
long long COM(ll n, ll k) {
    if (n < k)
        return 0;
    if (n < 0 || k < 0)
        return 0;
    if (n == k) {
        return 1;
    }
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
int gcd(ll N){
    ll ans=1;
    for(ll i=sqrt(N)+1; 0<i; i--){
        if(N%i==0){
            ans=i;
          	break;
        }
    }
    return ans;
}
//桁和
int digsum(ll N){
    bool a=true;
    ll ans=0;
    while(a==true){
        if(0<N){
            ans+=N%10;
            N-=N%10;
            N/=10;
        }
        else{
            a=false;
        }
    }
    return ans;
}
template<class T> inline bool chmin(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}
template<class T> inline bool chmax(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}
struct UnionFind {
    vector<int> par; // par[i]:iの親の番号　(例) par[3] = 2 : 3の親が2

    UnionFind(int N) : par(N) { //最初は全てが根であるとして初期化
        for(int i = 0; i < N; i++) par[i] = i;
    }

    int root(int x) { // データxが属する木の根を再帰で得る：root(x) = {xの木の根}
        if (par[x] == x) return x;
        return par[x] = root(par[x]);
    }

    void unite(int x, int y) { // xとyの木を併合
        int rx = root(x); //xの根をrx
        int ry = root(y); //yの根をry
        if (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのまま
        par[rx] = ry; //xとyの根が同じでない(=同じ木にない)時：xの根rxをyの根ryにつける
    }

    bool same(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返す
        int rx = root(x);
        int ry = root(y);
        return rx == ry;
    }
};
// vector<vector<int>> A(3, vector<int>(4));
int main() {
    ll N;
    cin>>N;
    string T;
    cin>>T;
    ll e=3;
    rep(i,10){
        e*=10;
    }
    ll a=(e-N+1)/3;
    ll b=a;
    ll c=a;
    if((e-N+1)%3==1){
        a++;
    }
    else if((e-N+1)%3==2){
        a++;
        b++;
    }
    ll ans=0;
    vector<char>A(N);
    vector<char>B(N);
    vector<char>C(N);
    rep(i,N){
        if(i%3==0){
            A[i]='1';
            B[i]='1';
            C[i]='0';
        }
        else if(i%3==1){
            A[i]='1';
            B[i]='0';
            C[i]='1';
        }
        else{
            A[i]='0';
            B[i]='1';
            C[i]='1';
        }
    }
    bool d=true;
    bool G=true;
    bool f=true;
    rep(i,N){
        if(T[i]!=A[i]){
            d=false;
        }
        if(T[i]!=B[i]){
            G=false;
        }
        if(T[i]!=C[i]){
            f=false;
        }
    }
    if(d==true){
        ans+=a;
    }
    if(G==true){
        ans+=b;
    }
    if(f==true){
        ans+=c;
    }
    cout<<ans<<endl;
}

