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)

//start of jonathanirvings' template v3.0.3 (BETA)

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

typedef long long LL;
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
typedef pair<string,string> pss;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vii;
typedef vector<LL> vl;
typedef vector<vl> vvl;

double EPS = 1e-9;
int INF = 1000000005;
long long INFF = 1000000000000000005LL;
double PI = acos(-1);
int dirx[8] = {-1,0,0,1,-1,-1,1,1};
int diry[8] = {0,1,-1,0,-1,1,-1,1};

#ifdef TESTING
  #define DEBUG fprintf(stderr,"====TESTING====\n")
  #define VALUE(x) cerr << "The value of " << #x << " is " << x << endl
  #define debug(...) fprintf(stderr, __VA_ARGS__)
#else
  #define DEBUG 
  #define VALUE(x)
  #define debug(...)
#endif

#define FOR(a,b,c) for (int (a)=(b);(a)<(c);++(a))
#define FORN(a,b,c) for (int (a)=(b);(a)<=(c);++(a))
#define FORD(a,b,c) for (int (a)=(b);(a)>=(c);--(a))
#define FORSQ(a,b,c) for (int (a)=(b);(a)*(a)<=(c);++(a))
#define FORC(a,b,c) for (char (a)=(b);(a)<=(c);++(a))
#define FOREACH(a,b) for (auto &(a) : (b))
#define REP(i,n) FOR(i,0,n)
#define REPN(i,n) FORN(i,1,n)
#define MAX(a,b) a = max(a,b)
#define MIN(a,b) a = min(a,b)
#define SQR(x) ((LL)(x) * (x))
#define RESET(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ALL(v) v.begin(),v.end()
#define ALLA(arr,sz) arr,arr+sz
#define SIZE(v) (int)v.size()
#define SORT(v) sort(ALL(v))
#define REVERSE(v) reverse(ALL(v))
#define SORTA(arr,sz) sort(ALLA(arr,sz))
#define REVERSEA(arr,sz) reverse(ALLA(arr,sz))
#define PERMUTE next_permutation
#define TC(t) while(t--)

inline string IntToString(LL a){
  char x[100];
  sprintf(x,"%lld",a); string s = x;
  return s;
}

inline LL StringToInt(string a){
  char x[100]; LL res;
  strcpy(x,a.c_str()); sscanf(x,"%lld",&res);
  return res;
}

inline string GetString(void){
  char x[1000005];
  scanf("%s",x); string s = x;
  return s;
}

inline string uppercase(string s){
  int n = SIZE(s); 
  REP(i,n) if (s[i] >= 'a' && s[i] <= 'z') s[i] = s[i] - 'a' + 'A';
  return s;
}

inline string lowercase(string s){
  int n = SIZE(s); 
  REP(i,n) if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
  return s;
}

inline void OPEN (string s) {
  #ifndef TESTING
  freopen ((s + ".in").c_str (), "r", stdin);
  freopen ((s + ".out").c_str (), "w", stdout);
  #endif
}

//end of jonathanirvings' template v3.0.3 (BETA)

int n,m;
string a,b;
int kanan[2005];
int kiri[2005];
pii data[2005];

int gede(const multiset<int> &m)
{
  if (SIZE(m) == 0) return 0;
  multiset<int>::iterator it = m.end();
  --it;
  return *it;
}

int solve()
{
  SORTA(data,m);
  multiset<int> ada;
  REP(i,m) ada.insert(data[i].se);
  int res = gede(ada);
  REP(i,m)
  {
    ada.erase(ada.find(data[i].se));
    MIN(res,data[i].fi + gede(ada));
  }
  return res * 2;
}

int main()
{
  a = GetString();
  b = GetString();
  n = SIZE(a);
  REP(i,n) if(b[i] == '1') goto lanjut;
  if (a == b) puts("0");
  else puts("-1");
  return 0;
  lanjut:;
  REP(i,n)
  {
    REP(j,n) if(b[(i+j)%n] == '1') 
    {
      kanan[i] = j;
      break;
    }
    REP(j,n) if(b[(i-j+n)%n] == '1')
    {
      kiri[i] = j;
      break;
    }
  }
  int risan = INF;
  REP(i,n)
  {
    // VALUE(i);
    int now = 0;
    vi pos;
    REP(j,n)
    {
      if (b[(i+j)%n] == '1')
      {
        if (a[j] == '0') ++now;
      } else 
      {
        if (a[j] == '1') 
        {
          pos.pb(j);
          ++now;
        }
      }
    }
    m = SIZE(pos);
    // kanan
    int dist = i;
    REP(j,m)
    {
      int k = pos[j];
      if (kanan[k] <= dist) data[j] = mp(0,0);
      else data[j] = mp(kiri[k],kanan[k]-dist);
    }
    MIN(risan, now + dist + solve());
    // debug("%d %d %d %d\n",now,dist,solve(),now+dist+solve());
    // REP(j,m) debug("%d %d %d\n",pos[j],data[j].fi,data[j].se);
    // kiri
    dist = n - i;
    REP(j,m)
    {
      int k = pos[j];
      if (kiri[k] <= dist) data[j] = mp(0,0);
      else data[j] = mp(kiri[k] - dist,kanan[k]);
    }
    MIN(risan, now + dist + solve());
    // debug("%d %d %d %d\n",now,dist,solve(),now+dist+solve());
    // REP(j,m) debug("%d %d %d\n",pos[j],data[j].fi,data[j].se);
  }
  printf("%d\n",risan);
  return 0;
}