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: Accepted)

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int solve(const string& A, const string& B){
    const int N = A.size();
    int s = B.find('1');
    if(s == string::npos) return (A.find('1') == string::npos ? 0 : -1);
    vector<int> nextL(N), nextR(N);
    int p = 0;
    for(int i=0;i<N;i++){
        if(B[(s+i)%N] == '1') p = (s+i)%N;
        nextL[(s+i)%N] = p;
    }
    for(int i=0;i<N;i++){
        if(B[(s+N-i)%N] == '1') p = (s+N-i)%N;
        nextR[(s+N-i)%N] = p;
    }
    int res = 10 * N;
    for(int shift=0;shift<N;shift++){
        int cur = 0;
        vector<pair<int, int>> vp;
        for(int i=0;i<N;i++){
            if(A[i] == B[(i+shift)%N]) continue;
            ++cur;
            if(A[i] == '0') continue;
            if(i+shift < N && i <= nextR[i] && nextR[i] <= i+shift) continue;
            if(i+shift >= N && (nextR[i] <= (i+shift)%N || i <= nextR[i])) continue;
            int left = nextL[i] - i;
            if(left > 0) left -= N;
            int right = nextR[(i+shift)%N] - (i+shift)%N;
            if(right < 0) right += N;
            vp.emplace_back(left, right);
        }
        sort(vp.begin(), vp.end());
        int addMove = 3*N;
        int maxR = 0;
        for(auto& v : vp){
            addMove = min(addMove, -v.first + maxR);
            maxR = max(maxR, v.second);
        }
        addMove = min(addMove, maxR);
        res = min(res, cur + shift + 2 * addMove);
    }
    return res;
}

int main(){
    string A, B;
    while(cin >> A >> B){
        int a = solve(A, B);
        reverse(A.begin(), A.end());
        reverse(B.begin(), B.end());
        int b = solve(A, B);
        cout << min(a, b) << endl;
    }
}