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: Runtime Error)

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

const int N = 2005;

char s[N];
int n, r[N], l[N], f[N], ans = 1e9;
bool a[N], b[N];
vector<int>p[N];

int gr (int x) {
	if (r[x] != -1) return r[x];
	return r[x] = b[x] ? 0 : gr((x + 1) % n) + 1;
}

int gl (int x) {
	if (l[x] != -1) return l[x];
	return l[x] = b[x] ? 0 : gl((x - 1 + n) % n) + 1;
}

void Max (int &x, int y) { if (x < y) x = y; }
void Min (int &x, int y) { if (x > y) x = y; }

void Solve () {
	memset(l, -1, sizeof l);
	memset(r, -1, sizeof r);
	for (int i = 0; i < n; ++i) gr(i), gl(i);
	f[n - 1] = 0;
	for (int i = 0; i < n; ++i) {
		int cnt = 0;
		for (int j = 0; j < n; ++j) p[j].clear();
		for (int j = 0; j < n; ++j) if ((a[j] ^ b[(j + i) % n])) {
			++cnt;
			p[r[j]].emplace_back(l[j]);
		}
		for (int j = n - 1; j; --j) {
			f[j - 1] = f[j];
			for (auto v : p[j]) Max(f[j - 1], v);
		}
		for (int j = i; j < n; ++j) Min(ans, cnt + j + j - i + f[j] * 2);
	}
}

int main () {
	scanf("%s", s);
	n = strlen(s);
	for (int i = 0; i < n; ++i) a[i] = s[i] - '0';
	scanf("%s", s);
	for (int i = 0; i < n; ++i) b[i] = s[i] - '0';
	if (*max_element(b, b + n) == 0 && *max_element(a, a + n) == 1) return puts("-1"), 0;
	Solve();
	reverse(a, a + n);
	reverse(b, b + n);
	Solve();
	printf("%d\n", ans);
	return 0;
}