Problem:
Score : 1000 points

Problem Statement

You have two strings A = A_1 A_2 ... A_n and B = B_1 B_2 ... B_n of the same length consisting of 0 and 1.

You can transform A using the following operations in any order and as many times as you want:

Shift A by one character to the left (i.e., if A = A_1 A_2 ... A_n, replace A with A_2 A_3 ... A_n A_1).

Shift A by one character to the right (i.e., if A = A_1 A_2 ... A_n, replace A with A_n A_1 A_2 ... A_{n-1}).

Choose any i such that B_i = 1. Flip A_i (i.e., set A_i = 1 - A_i).

You goal is to make strings A and B equal.

Print the smallest number of operations required to achieve this, or -1 if the goal is unreachable.

Constraints

1 \leq |A| = |B| \leq 2,000

A and B consist of 0 and 1.

Input

Input is given from Standard Input in the following format:

A
B

Output

Print the smallest number of operations required to make strings A and B equal, or -1 if the goal is unreachable.

Sample Input 1

1010
1100

Sample Output 1

3

Here is one fastest way to achieve the goal:

Flip A_1: A = 0010

Shift A to the left: A = 0100

Flip A_1 again: A = 1100

Sample Input 2

1
0

Sample Output 2

-1

There is no way to flip the only bit in A.

Sample Input 3

11010
10001

Sample Output 3

4

Here is one fastest way to achieve the goal:

Shift A to the right: A = 01101

Flip A_5: A = 01100

Shift A to the left: A = 11000

Shift A to the left again: A = 10001

Sample Input 4

0100100
1111111

Sample Output 4

5

Flip A_1, A_3, A_4, A_6 and A_7 in any order.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

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

typedef long long int ll;
typedef long double ld;

#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define rev(i,a,b) for(ll i=a;i>=b;i--)
#define pll pair<ll,ll>
#define vll vector<ll>
#define sll set<ll>
#define vpll vector<pll>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define ln length()
#define M 1000000007

string s1,s2;
ll req[2005],lt[2005],rt[2005];
vll cur[2005];
ll n;

ll mindis(ll x,ll y){
    if(x>y) swap(x,y);
    return min(y-x,n-(y-x));
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);

    cin>>s1>>s2;
    n=s1.size();

    ll ct1=0;
    for(char c:s2) if(c == '1') ct1++;
    if(ct1 == 0){
        for(char c:s1) if(c == '1'){
            cout<<-1<<'\n';
            return 0;
        }
        cout<<0<<'\n';
        return 0;
    }
    if(n == 1){
        if(s1 == s2) cout<<0<<'\n';
        else cout<<1<<'\n';
        return 0;
    }
    rep(i,0,n-1){
        ll st=i;
        while(st>=0 && s2[st] == '0') st--;
        if(st>=0) lt[i]=st;
        else{
            st=n-1;
            while(s2[st]!='1') st--;
            lt[i]=st;
        }
        st=i;
        while(st<n && s2[st] == '0') st++;
        if(st!=n) rt[i]=st;
        else{
            st=0;
            while(s2[st]!='1') st++;
            rt[i]=st;
        }
    }

    ll ans=1e15;
    rep(st,0,n-1){
        rep(i,0,n-1){
            req[i]=0;
            if(i<st && s2[n-st+i]!=s1[i]) req[i]=1;
            if(i>=st && s2[i-st]!=s1[i]) req[i]=1;
        }
        rep(i,0,n-1) cur[i].clear();
        ll rqct=0;
        rep(i,0,n-1) if(req[i]) cur[lt[i]].pb(i);
        multiset<ll> rtcl;
        rep(i,0,n-1) if(req[i]) {
            rqct++;
            if(rt[i]>=i) rtcl.insert(rt[i]-i);
            else rtcl.insert(rt[i]+n-i);
        }
        vpll srt;
        rep(i,0,n-1) if(req[i]){
            if(lt[i]<=i) srt.pb(mp(i-lt[i],i));
            else srt.pb(mp(i+n-lt[i],i));
        }
        sort(srt.begin(),srt.end());
        reverse(srt.begin(),srt.end());
        rep(shl,0,n-1){
            while(!srt.empty() && srt.back().F <= shl){
                if(rt[srt.back().S] >= srt.back().S) rtcl.erase(rt[srt.back().S] - srt.back().S);
                else rtcl.erase(rt[srt.back().S] + n - srt.back().S);
                srt.pop_back();
            }
            if(rtcl.empty()) ans=min(ans,shl+rqct+mindis(shl,st));
            else{
                auto it=rtcl.rbegin();
                ans=min(ans,2*shl+rqct+*it+mindis(n-*it,st));
            }
        }
    }
    cout<<ans<<'\n';

}