每天一道英文题,ICPC不自闭(3)

Codeforces Global Round 16 - B

题目翻译

二进制字符串是由字符 0 和 1 组成的字符串。

让二进制字符串的 MEX 为0、1或2中不在字符串中出现的最小数字。例如,001011 的 MEX 为 2,因为 0 和 1 在字符串中至少出现一次,1111 MEX 为 0 ,因为 0 和 2 不在字符串中出现,并且0<2。

给出了一个二进制字符串 s。你应该将其剪切成任意数量的子字符串,从而使每个字符正好位于一个子字符串中。可以将字符串剪切成单个子字符串-整个字符串。

如果 a 可以通过删除开头的几个(可能是零个或全部)字符和结尾的几个(可能是零个或全部)字符从 b 中获得,则字符串 a 是字符串 b 的子字符串。

所有子字符串片段的 MEX 的最小和是多少?

输入

输入由多个测试用例组成。第一行包含一个整数 t(1≤t≤1e4)-测试用例的数量。测试用例的描述如下。

每个测试用例包含一个二进制字符串 s(1≤|s|≤1e5)。

保证所有测试用例中 s 的长度总和不超过 1e5。

输出

对于每个测试用例,打印一个整数——所有子字符串的 MEX 的最小和,可以通过优化切割 s 得到。

样例

输入

6
01
1111
01100
101
0000
01010
 

输出

1
0
2
1
1
2
 

解释

在第一个测试用例中,最小和为MEX(0)+MEX(1)=1+0=1。

在第二个测试用例中,最小和为MEX(1111)=0。

在第三个测试用例中,最小和为MEX(01100)=2。

解题思路

给定一个二进制字符串,就考虑 0 和 1 就可以了,初始化 num 为 s[0],从前往后找,如果不同并且 num='0' 就至少要为 1 了,出现两次就可以退出循环输出了,此时还要注意特判一下,如果最后一位是 '0' 就让 cnt 再加 1。

代码示例

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
int t;
int num;
int cnt;
string s;
 
int main(){
	cin>>t;
	while(t--){
		cin>>s;
		cnt=0;
		int len=s.size();
		num=s[0];
		for(int i=0;i<len;i++){
			if(s[i]!=num){
				if(num=='0') cnt++;
				num=s[i];
			}
			if(cnt>=2) break;
		}
		if(cnt<2&&s[len-1]=='0') cnt++;
		cout<<cnt<<endl;
	}
	return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值