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 <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAXN 2010
char buf[MAXN];
int n, a[MAXN], b[MAXN], c[MAXN], A, B, ans = 0x3F3F3F3F;
inline int _sum(int l, int r) {
	return c[r] - (l ? c[l - 1] : 0);
}
inline int sum(int l, int r) {
	return l <= r ? _sum(l, r) : _sum(l, n - 1) + _sum(0, r);
}
inline void solve() {
	c[0] = b[0];
	for (int i = 1; i < n; i++) c[i] = c[i - 1] + b[i];

	for (int d = 0; d < n; d++) {
		int tmp = 0;
		for (int i = 0; i < n; i++)
			if (a[i] != b[(i + d) % n]) tmp++;
		ans = std::min(ans, tmp + d + n);
		register int l = 0, r = std::min(n / 2, n - d);
		while (l <= r) {
			int mid = (l + r) >> 1;
			for (int i = 0; i < n; i++) {
				if (a[i] != b[(i + d) % n]) {
					if (!sum(i, (i + d + mid) % n) && !sum((i - mid + n) % n, (i + d) % n)) goto fail;
				}
			}
			ans = std::min(ans, tmp + d + mid * 2);
			r = mid - 1;
			continue;
		fail:
			l = mid + 1;
		}
	}
}
int main() {
	scanf("%s", buf);
	n = strlen(buf);
	for (int i = 0; i < n; i++) A |= (a[i] = buf[i] == '1');
	scanf("%s", buf);
	for (int i = 0; i < n; i++) B |= (b[i] = buf[i] == '1');
	if (!B) return puts(A ? "-1" : "0"), 0;
	solve();
	std::reverse(a, a + n);
	std::reverse(b, b + n);
	solve();
	printf("%d\n", ans);
	return 0;
}