B. Subsequence Hate【1400 / 贪心】

本文介绍了一种使用前缀和的方法来解决Codeforces问题1363/B,涉及统计字符串中特定模式(0001111和111000)出现的最少次数。通过分析字符串并借助计数技巧,展示了如何简化问题并高效求解。
摘要由CSDN通过智能技术生成

在这里插入图片描述
https://codeforces.com/problemset/problem/1363/B
通过分析只能变成一下几种情况:

  • 000000
  • 1111111
  • 000001111
  • 1111100

其实00000和11111在上面两个中包含了,不过这样更清晰一点。
用前缀和来维护一段区间有多少个1.

#include<bits/stdc++.h>
using namespace std;
int solve(string s)
{
	int cnt1=0;
	for(int i=0;i<s.size();i++) if(s[i]=='0') cnt1++;//全1
	int cnt2=0;
	for(int i=0;i<s.size();i++) if(s[i]=='1') cnt2++;//全0
	
	int ss[1005]={0};//前缀和
	s="*"+s;
	for(int i=1;i<s.size();i++)
	{
		if(s[i]=='1') ss[i]=ss[i-1]+1;
		else ss[i]=ss[i-1];
	}
	int cnt3=1e9;//0001111 
	int n=s.size()-1;
	for(int i=1;i<s.size();i++)
	{
		int len1=ss[i];
		int len2=(n-i)-(ss[n]-ss[i]);
		cnt3=min(cnt3,len1+len2);
	}
	int cnt4=1e9;//111000 
	for(int i=1;i<s.size();i++)
	{
		int len1=i-ss[i];
		int len2=ss[n]-ss[i];
		cnt4=min(cnt4,len1+len2);
	}
	return min({cnt1,cnt2,cnt3,cnt4});
}
int main(void) 
{
	int t; cin>>t;
	while(t--)
	{
		string s; cin>>s;
		cout<<solve(s)<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值