#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define gc getchar
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(),(x).end()
#define x1 uvuvwevwevwe
#define y1 onyetenyevwe
#define x2 ugwemubwem
#define y2 ossas
#define cout if(false) cout
typedef long long LL;
typedef long double LD;
typedef pair<int,int> pii;
template <typename T> void scan(T &angka){
	angka=0;char input=gc();T kali=1;
	while(!(48<=input&&input<=57)){	if(input=='-')	kali=-1;input=gc();}
	while(48<=input&&input<=57)	angka=(angka<<3)+(angka<<1)+input-48,input=gc();angka*=kali;
}
template <typename T1,typename T2> void scan(T1 &angka1,T2 &angka2){
	scan(angka1);scan(angka2);
}
//kalau 0 itu kiri, 1 itu kanan
int n,ans,ter[2][2005],suffikscost[2005],urutan[2005],size;			//pake zero based
int patokan,pospatokan;		//patokan itu dak pernah berubah, pospatokan berdasarkan starting pointnya
string a,b;
bool butuh[2005];
int indeks(int pos){				//return indeks sebenarnya setelah di masukkan ke dalam indeks 0 sampai n-1
	if(pos>=n||pos<=-n)
		pos%=n;
	if(pos<0)
		pos+=n;
	return pos;
}
int jarak(int indeks1,int indeks2){					//jarak dari dua buah indeks bisa ke kiri bisa ke kanan
	indeks1=indeks(indeks1);
	indeks2=indeks(indeks2);
	int ret=abs(indeks1-indeks2);
	return min(ret,n-ret);
}
bool specialcase(){			//kasus di mana jawabannya bisa saja -1
	for(int i=0;i<n;i++)
	{
		if(b[i]!='0')				//artinya ada ji flippernya
			return false;
	}
	for(int i=0;i<n;i++)
	{
		if(a[i]!='0')
		{
			printf("-1\n");
			return true;
		}
	}
	printf("0\n");
	return true;
}
int satuterdekat(int s,int arah){			//cari jarak nya angka 1 terdekat di B dari s sesuai dengan arah
	int ret=0;
	while(b[s]!='1')
	{
		ret++;
		s=indeks(s+arah);
	}
	return ret;
}
void hitungter(){
	//isi terkiri dulu
	ter[0][0]=satuterdekat(0,-1);
	for(int i=1;i<n;i++)
	{
		ter[0][i]=ter[0][i-1]+1;
		if(b[i]=='1')				//kalau sekarang posisinya berarti gak perlu goyang dong
			ter[0][i]=0;
	}
	
	//isi terkanan kemudian
	ter[1][n-1]=satuterdekat(n-1,1);
	for(int i=n-2;i>=0;i--)
	{
		ter[1][i]=ter[1][i+1]+1;
		if(b[i]=='1')
			ter[1][i]=0;
	}
}
void isibutuh(int s){			//isi mana saja yang perlu di flip
	for(int i=0;i<n;i++)
		butuh[i]=(b[i+s]!=a[i]);
}
int totalbutuh(){
	int ret=0;
	for(int i=0;i<n;i++)
	{
		if(butuh[i])
			ret++;
	}
	return ret;
}
bool cmp0(int a,int b){				//sort by terkiri
	return (ter[0][a]<ter[0][b]);
}
bool cmp1(int a,int b){				//sort by terkanan
	return (ter[1][a]<ter[1][b]);
}
void isiurutan(){				//nothing just isi yang butuh ke array urutan
	size=0;
	for(int i=0;i<n;i++)
	{
		if(!butuh[i])
			continue;
		urutan[size++]=i;
	}
}
void isisuffiks(int id){
	suffikscost[size]=0;
	for(int i=size-1;i>=0;i--)
		suffikscost[i]=max(suffikscost[i+1],ter[id^1][urutan[i]]);
}
int geser(int id){
	int arah=(id==0)?1:-1;
	if(id==0)
		sort(urutan,urutan+size,cmp0);
	else
		sort(urutan,urutan+size,cmp1);
	isisuffiks(id);
	//cout<<"test suffiks cost "<<suffikscost[0]<<endl;
	int ret=ter[id][urutan[size-1]]+jarak(pospatokan-arah*ter[id][urutan[size-1]],patokan);
	for(int i=0;i<size;i++)
	{
		int calonret=suffikscost[i+1]+2*ter[id][urutan[i]]+jarak(pospatokan+arah*suffikscost[i+1],patokan);
		ret=min(ret,calonret);
	}
	return ret;
}
int bestcost(int s){					//hitung cost terminimal dengan string patokan B starting dari s
	isibutuh(s);
	int totalflip=totalbutuh();
	isiurutan();
	int costgeser=min(geser(0),geser(1));
	//cout<<"ini cost geser kiri "<<geser(0)<<" kanan "<<geser(1)<<endl;
	return totalflip+costgeser;
}
int main()
{
	cin>>a>>b;
	n=a.length();
	if(specialcase())
		return 0;
	hitungter();
	pospatokan=patokan=satuterdekat(0,1);
	b+=b;			//dua kali lipatkan string b
	ans=10000000;			//berperan sebagai INF
	for(int s=0;s<n;s++)			//starting point
	{
		ans=min(ans,bestcost(s));
		//return 0;				//just for debug
		pospatokan=indeks(pospatokan-1);
	}
	/*for(int s=0;s<n;s++)
	{
		if(bestcost(s)==ans)
			cout<<"bestnya pada "<<s<<endl;
	}*/
	printf("%lld\n",ans);
}

Measured memory_bytes: 256