比较蛋疼贪心,具体除非S在位置i为 ?并且 T在 i 为 1,负责S为?的全换成0
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<cmath>
typedef long long LL;
using namespace std;
#define MAXD 200 + 10
int main(){
int T,Case = 1;
scanf("%d",&T);
while(T--){
char str1[MAXD],str2[MAXD];
int a1 = 0,b1 = 0,c1 = 0; /*分别代表0,1,问号的个数*/
int a2 = 0,b2 = 0; /*分别代表0,1,问号的个数*/
scanf("%s",str1);
scanf("%s",str2);
printf("Case %d: ",Case++);
int L = strlen(str1);
for(int i = 0 ; i < L ; i++){
if(str1[i] == '0') a1 ++;
else if(str1[i] == '1') b1 ++;
else if(str1[i] == '?') c1 ++;
}
for(int i = 0 ; i < L ; i++){
if(str2[i] == '0') a2 ++;
else
if(str2[i] == '1') b2 ++;
}
if(c1 + a1 < a2){
printf("-1\n");
continue;
}
/*先将问号变成缺少的0,优先选择对应位置也是0的位置变*/
int zero = a2 - a1;
int cnt = 0;
/*zero是str1比str2少的0的个数*/
if(zero > 0){
/*先改相同位置为0的?*/
for(int i = 0 ; i < L && zero > 0; i++){
if(str1[i] == '?' && str2[i] == '0'){
str1[i] = '0';
zero--;
cnt++;
}
}
for(int i = 0 ; i < L && zero > 0 ; i ++)if(str1[i] == '?'){
str1[i] = '0';
cnt ++;
zero--;
}
for(int i = 0 ; i < L ; i++)if(str1[i] == '?' && str2[i] == '1'){
str1[i] = '1';
cnt ++;
}
for(int i = 0 ; i < L ; i++)if(str1[i] == '?'){
str1[i] == '0';
cnt ++;
}
int x = 0,y = 0;
for(int i = 0 ; i < L ; i++)
if((str1[i] == '1')&&(str2[i]) == '0')
x++;
else if((str1[i] == '0')&&(str2[i] == '1'))
y++;
cnt += max(x,y);
printf("%d\n",cnt);
}
else { /*如果str1的0比str2的多*/
for(int i = 0 ; i < L ; i++)if((str1[i] == '?') && (str2[i] =='1')){
cnt ++;
str1[i] = '1';
}
for(int i = 0 ; i < L ; i++)if(str1[i] == '?'){
cnt ++;
str1[i] = '0';
}
int x = 0,y = 0;
for(int i = 0 ; i < L ; i++)
if((str1[i] == '1')&&(str2[i]) == '0')
x++;
else if((str1[i] == '0')&&(str2[i] == '1'))
y++;
cnt += max(x,y);
printf("%d\n",cnt);
}
}
return 0;
}