UVA12545 Bits Equalizer(脑洞)

You are given two non-empty strings S and T of equal lengths. S contains the characters ‘0’, ‘1’and ‘?’, whereas T contains ‘0’ and ‘1’ only. Your task is to convert S into T in minimum number ofmoves. In each move, you can

1. change a ‘0’ in S to ‘1’

2. change a ‘?’ in S to ‘0’ or ‘1’

3. swap any two characters in S

As an example, suppose S = ”01??00” and T = ”001010”. We can transform S into T in 3 moves:• Initially S = ”01??00”• – Move 1: change S[2] to ‘1’. S becomes ”011?00”• – Move 2: change S[3] to ‘0’. S becomes ”011000”• – Move 3: swap S[1] with S[4]. S becomes ”001010”• S is now equal to T


Input

The first line of input is an integer C (C ≤ 200) that indicates the number of test cases. Each caseconsists of two lines. The first line is the string S consisting of ‘0’, ‘1’ and ‘?’. The second line is thestring T consisting of ‘0’ and ‘1’. The lengths of the strings won’t be larger than 100.


Output

For each case, output the case number first followed by the minimum number of moves required toconvert S into T. If the transition is impossible,output ‘-1’ instead.


Sample Input

3

01??00

001010

01

10

110001

000000


Sample Output

Case 1: 3

Case 2: 1

Case 3: -1


给出两个字符串,问你最小变换次数使得两字符串相同。合理的变换有:0变为1,?变为0或1,交换两个相邻字符。


统计题目给出的符合合理变换的数目,包括num1计数"?1",num0计数"?0" ,zero计数 "01" ,one计数"10"。

如果"01"数目加上"?1"数目少于"10"数目,则不能通过交换使两个字符串相同。

如果"01"数目大于等于"10"数目则变换次数为zero + num0 + num1。

否则变换次数为one + num0 + num1。


AC代码:


#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 105;
int main(int argc, char const *argv[])
{
	int t;
	scanf("%d", &t);
	for(int cas = 1; cas <= t; ++cas) {
		char s1[MAXN], s2[MAXN];
		scanf("%s%s", s1, s2);
		int len1 = strlen(s1), len2 = strlen(s2);
		if(len1 != len2) {
			printf("Case %d: -1\n", cas); 
			continue;
		}	
		int zero = 0, one = 0, num1 = 0, num0 = 0;
		for(int i = 0; i < len1; ++i) {
			if(s1[i] == '?') {
				if(s2[i] == '1') num1++;
				if(s2[i] == '0') num0++;
			}
			if(s1[i] == '0' && s2[i] == '1') zero++;
			if(s1[i] == '1' && s2[i] == '0') one++;
		}
		if(zero >= one) printf("Case %d: %d\n", cas, zero + num0 + num1);
		else if(zero + num1 < one) printf("Case %d: -1\n", cas); // 无法通过交换满足题意
		else printf("Case %d: %d\n", cas, one + num1 + num0);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值