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>

using namespace std;

#define ll long long
#define forn(i, n) for (ll i = 0; i < (ll) n; ++i)
#define sz(a) static_cast<int>(a.size())

char buff[(int) 2e7 + 17];
const ll inf = (ll) 1e9 + 7ll;

const int maxn = (int) 1e4 + 17;

int n;
string s, t;

bool read() {
    if (scanf("%s", buff) != 1)
        return false;

    s = buff;
    scanf("%s", buff);
    t = buff;
    return true;
}

void solve() {
    if (!count(t.begin(), t.end(), '1')) {
        if (!count(s.begin(), s.end(), '1'))
            printf("0\n");
        else
            printf("-1\n");

        return ;
    }

    n = sz(s);
    int ans = inf;

    for (int sh = -n + 1; sh < n; ++sh) {
        vector<int> L(n), R(n);
        int last = -1;

        for (int i = n - 1; i >= 0; --i)
            if (t[i] == '1') {
                last = i - n;
                break;
            }

        for (int i = 0; i < n; ++i) {
            if (t[i] == '1')
                last = i;

            L[i] = last;
        }

        for (int i = 0; i < n; ++i)
            if (t[i] == '1') {
                last = i + n;
                break;
            }

        for (int i = n - 1; i >= 0; --i) {
            if (t[i] == '1')
                last = i;

            R[i] = last;
        }

        int res = 0;

        for (int i = 0; i < n; ++i)
            if (s[i] != t[(n + i + sh) % n])
                ++res;

        multiset< pair<int, int> > a, b;

        for (int i = 0; i < n; ++i)
            if (s[i] != t[(n + i + sh) % n]) {
                int lq = i;
                int rq = i + sh;

                if (sh < 0)
                    swap(lq, rq);

                if (lq > rq)
                    rq += n;

                if (R[lq] > rq) {
                    int x = i - L[lq];
                    int y = R[rq] - i;
                    a.insert(make_pair(x, y));
                    b.insert(make_pair(y, x));
                }
            }

        int p = 0;

        if (!a.empty()) {
            p = inf;

            for (int l = 0; l < n; ++l) {
                while (!a.empty() && a.begin()->first <= l) {
                    b.erase(make_pair(a.begin()->second, a.begin()->first));
                    a.erase(a.begin());
                }

                int r = 0;

                if (!b.empty())
                    r = b.rbegin()->first;

                p = min(p, l + r);
            }
        }

        ans = min(ans, res + 2 * p + abs(sh));
    }

    printf("%d\n", ans);
}

int main() {
#if SEREZHKA
    freopen("file.in", "r", stdin);
#endif

    while (read())
        solve();

    return 0;
}