题意:
给出两个字符串 S和T ,S中只含0,1,?,T中只含0,1 要求对S操作把S转换成T,规则如下:
1.0 ->1
2.任意位置两两交换
3.?->0或1
求最少步数,如果无法转换输出-1
对于S与T的不对应情况,能很直观的分为四类,01 10 1? 0?,由于交换能够使步数减少,01 和 10必然要先交换,交换之后如果只剩下01,那么剩下的不对应个数累加就直接是答案,否则再考虑?->0继续产生匹配减少个数累加判断结果
#include<cstring>
#include<string>
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstdlib>
#include<cmath>
#include<vector>
//#pragma comment(linker, "/STACK:1024000000,1024000000");
using namespace std;
#define INF 0x3f3f3f3f
char s1[205];
char s2[205];
int a01,a10,ax1,ax0;
int main()
{
int ca=1;
int T;
scanf("%d",&T);
while(T--)
{
a01=a10=ax1=ax0=0;
scanf("%s%s",s1,s2);
int len=strlen(s1);
for(int i=0;i<len;i++)
{
if(s1[i]!=s2[i])
{
if(s1[i]=='?')
{
if(s2[i]=='0') ax0++;
else ax1++;
}
else if(s1[i]=='0') a01++;
else a10++;
}
}
int ans=0;
ans+=min(a01,a10);
a01-=ans;
a10-=ans;
int flag=0;
if(a01)
{
ans+=a01;
}
else if(a10)
{
if(ax1>=a10)
{
ans+=2*a10;
ax1-=a10;
}
else flag=1;
}
ans+=ax1;
ans+=ax0;
printf("Case %d: ",ca++);
if(!flag) printf("%d",ans);
else printf("-1");
puts("");
}
return 0;
}