2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】

题目传送门


题目描述

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


输入描述:

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


输出描述:

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


输入

5 1
10101


输出

3


说明

只有 1 1 次操作机会。
将第二个位置的 0 \mathit0 改成 1 \mathit1 ,字符串变成 11101 \mathit{11101} ,可以选出 111 \mathit{“111”} 子串,长度为 3 3
如果修改第三个或者第四个位置的字符也可以选出长度为 3 3 的子串。


题解

  • 显然操作要么全1变0,要么全0变1。
    分别处理两种操作即可。对于1变0的情况,可以分别统计每个1的前缀1和后缀1的位置(第一个1的前缀为 0 0 ,最后一个1的后缀为 n + 1 n+1 ),那么 k k 次操作,即变换连续 k k 个1,最终的字符串长度就是第 i i 个1的前缀1到第 i + k i+k 个后缀1之间的距离。
    对于0变1的情况同理。
  • c f 1600 参考cf难度分:1600

AC-Code

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

int main() {
    int n, k;
    while (cin >> n >> k) {
        string s;   cin >> s;
        vector<int>v(2, 0);
        int res = 0, max_num = 0;
        for (int i = 0, j = 0; j < s.length(); ++j) {
            ++v[s[j] - '0'];
            max_num = max(max_num, v[s[j] - '0']);
            while (j - i + 1 - max_num > k)
                --v[s[i++] - '0'];
            res = max(res, j - i + 1);
        }
        cout << res << endl;
    }
}
发布了157 篇原创文章 · 获赞 99 · 访问量 9823

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104174767
今日推荐