个人感觉突破点是0可以换成1,而1不能换成0。所以想到应该优先满足1-0(上1下0)的情况。而其它三种情况都只用简单变换就可以满足配对。
用0-1来进行swap显然是最快的,同时可以满足两组配对。
如果没有0-1了,那么可以用?-1。先换成0-1再swap。
如果两种都没有了,说明无解,因为下面的1是变不出来的,而我们现在还有上面的1未能配对。
把上面的1成功配对后,其他的都可以通过一次操作正确配对
由于不需打印过程,我们只需要记录四种组合(1-0、0-1、?-1、?-0)的数量即可,不需保存序列也不需保存0-0和1-1的数量
Run Time: 0.009s
#define UVa "8-3.12545.cpp"
char fileIn[30] = UVa, fileOut[30] = UVa;
#include<cstring>
#include<cstdio>
using namespace std;
//Global Variables. Reset upon Each Case!
int C;
int one_zero, zero_one, q_one, q_zero;
int ans;
const int maxn = 100 + 5;
char s1[maxn], s2[maxn];
/////
void init() {
ans = 0;
one_zero = zero_one = q_one = q_zero = 0;
scanf("%s", &s1);
scanf("%s", &s2);
for(int i = 0; i < strlen(s1); i ++) {
if(s1[i] == '1' && s2[i] == '0') one_zero ++;
else if (s1[i] == '0' && s2[i] == '1') zero_one ++;
else if(s1[i] == '?' && s2[i] == '0') q_zero ++;
else if(s1[i] == '?' && s2[i] == '1') q_one ++;
}
}
int main() {
scanf("%d", &C);
for(int kase = 0; kase < C; kase ++) {
init();
while(one_zero && zero_one) { //swap 1-0 and 0-1
one_zero --;
zero_one --;
ans ++;
}
while(one_zero && q_one) { //swap 1-0 and ?-1
one_zero --;
q_one --;
ans += 2;
}
if(one_zero)
ans = -1;
else
ans += zero_one + q_one + q_zero;
printf("Case %d: %d\n", kase+1, ans);
}
return 0;
}