2020牛客寒假算法基础集训营1 H.nozomi和字符串

2020牛客寒假算法基础集训营1 H.nozomi和字符串

题目描述

nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 “01”串而言,每次操作可以把 0 字符改为 1 字符,或者把 1 字符改为0 字符。所谓“01”串,即只含字符 0 和字符1 的字符串。
nozomi有最多k次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注: 次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。

输入描述:

第一行输入两个正整数 和
输入仅有一行,为一个长度为 的、仅由字符 0 和 1 组成的字符串。

输出描述:

一个正整数,为满足条件的子串长度最大值。

示例1

输入

5 1
10101

输出

3

这题就是用两个vector分别记录下每个0和1的位置,假设1变0,变换k次即求第i个1的前缀与第i+k-1个1的后缀的距离的最大值,须将第一个1的前缀置为-1,最后一个的后缀置为n,以应对k=0的情况,AC代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int n,k;
    string s;
    vector<int>q0,q1;
    cin>>n>>k>>s;
    q0.push_back(-1);
    q1.push_back(-1);
    for(int i=0;i<n;i++){
        if(s[i]=='0') q0.push_back(i);
        else q1.push_back(i);
    }
    q0.push_back(n);
    q1.push_back(n);
    int ans=0;
    if(q0.size()-2<=k) ans=n;
    else{
    for(int i=1,j=k;j<q0.size()-1;i++,j++)
        ans=max(ans,q0[j+1]-q0[i-1]-1);
    }
    if(q1.size()-2<=k) ans=n;
    else{
    for(int i=1,j=k;j<q1.size()-1;i++,j++)
        ans=max(ans,q1[j+1]-q1[i-1]-1);
    }
    cout<<ans;
    return 0;
}
发布了288 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/104221287
今日推荐