白菜按钮只有两种状态1与0,蠢萌蠢萌的ljw想把一串白菜按钮变成目标状态。 但是ljw体态圆润,按一个按钮就会不小心碰到旁边两个。 已知如果某个白菜按钮被按下,就会改变状态,求ljw最少的操作次数。
输入格式
两行,给出两个由0、1组成的等长字符串(长度不超过5*10^6),表示当前和目标状态。
输出格式
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
白菜按钮只有两种状态1与0,蠢萌蠢萌的ljw想把一串白菜按钮变成目标状态。 但是ljw体态圆润,按一个按钮就会不小心碰到旁边两个。 已知如果某个白菜按钮被按下,就会改变状态,求ljw最少的操作次数。
输入格式
两行,给出两个由0、1组成的等长字符串(长度不超过5*10^6),表示当前和目标状态。
输出格式
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
#include<bits/stdc++.h>
using namespace std;
char a[5000005],b[5000005];
int main()
{
scanf("%s%s",a+1,b+1);
int len=strlen(a+1);
for(int i=1;i<=len;i++)
{
if(a[i]==b[i])a[i]=b[i]=0;
else a[i]=b[i]=1;
}
if(len==1)
{
if(a[1]==0)printf("0\n");else printf("1\n");
return 0;
}
if(len==2)
{
if(a[1]!=a[2])printf("impossible\n");
else if(a[1]==a[2])
{
if(a[1]==0)printf("0\n");else printf("1\n");
}
return 0;
}
int n1=1,n2=0;
a[1]^=1;a[2]^=1;
for(int i=1;i<=len-1;i++)
{
if(a[i]==1){a[i]^=1;a[i+1]^=1;a[i+2]^=1;n1++;}
if(b[i]==1){b[i]^=1;b[i+1]^=1;b[i+2]^=1;n2++;}
}
if(a[len]==1)n1=999999999;
if(b[len]==1)n2=999999999;
int ans=min(n1,n2);
if(ans==999999999)printf("impossible\n");
else printf("%d\n",ans);
return 0;
}