Codeforces Round #646 (Div. 2)--B. Subsequence Hate(1400分 思维+前缀和)

在这里插入图片描述

题意:
如果一个字符串不包含 "010 "或 "101 "的子序列,则称为好字符串–例如,"1001 "包含 "101 "的子序列,因此它不是一个好字符串,而 "1000 "既不包含 "010 "也不包含 "101 "的子序列,所以它是一个好字符串。

那么,他最少要进行多少次操作才能使该字符串成为好字符串?可以证明,通过这些操作,我们可以使任何字符串变得良好。

思路:
010和101作为子串的情况都不能出现,那么母串出现0紧接着1的时候之后就不能出现0了,所以母串可能是00111or1110or1101,当然第三种情况会被视为101,所以也不能出现,所以答案串有几种情况:①:0000000,②000111,③111111,④111000,计算答案的时候可以把0开头和1开头分两种情况~计算答案的时候还有小细节我的处理是:
利用前缀和对于前面两种情况枚举边界的位置,答案数就是之后的0+之前的1和之前的1+之后的0取min~

#include<bits/stdc++.h>
using namespace std;

char s1[1005];
int sum0[1005],sum1[1005];
int main()
{
    int n,i,j,t;
    cin>>t;
    while(t--)
    {
        cin>>(s1+1);s1[0]='x';
        sum0[0]=0,sum1[0]=0;
        for(i=1;i<strlen(s1);i++) //0开头的情况
        {
            if(s1[i]=='0')
                sum0[i]=sum0[i-1]+1,sum1[i]=sum1[i-1];
            else
                sum1[i]=sum1[i-1]+1,sum0[i]=sum0[i-1];
        }
        int d1=strlen(s1)-1;
        int ans=0x3f3f3f3f;
        for(i=1;i<strlen(s1);i++)
        {
            ans=min({ans,((sum0[d1]-sum0[i])+(sum1[i-1])),(sum0[i-1]+sum1[d1]-sum1[i])});
        }
        ans=min({ans,d1-sum0[i-1],d1-sum1[i-1]});
        cout<<ans<<endl;
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值