0
点赞
收藏
分享

微信扫一扫

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


​​题目传送门​​

题目描述

nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_算法串而言,每次操作可以把 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_02 字符改为 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_算法_03 字符,或者把 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_算法_03 字符改为 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_02 字符。所谓\mathit{“01”}“01”串,即只含字符 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_02 和字符 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_字符串_07 的字符串。
nozomi有最多 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注: 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_08 次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。

输入描述:

第一行输入两个正整数 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_092020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_08
输入仅有一行,为一个长度为 的、仅由字符 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_022020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_字符串_07

输出描述:

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

输入

5 1
10101

输出

3

说明

只有 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_算法_03 次操作机会。
将第二个位置的 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_02 改成 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_字符串_07 ,字符串变成 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_后缀_16,可以选出 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_算法_17 子串,长度为 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_字符串_18
如果修改第三个或者第四个位置的字符也可以选出长度为 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_字符串_18

题解

  • 显然操作要么全1变0,要么全0变1。
    分别处理两种操作即可。对于1变0的情况,可以分别统计每个1的前缀1和后缀1的位置(第一个1的前缀为2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_字符串_20,最后一个1的后缀为2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_字符串_21),那么2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_22次操作,即变换连续2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_22个1,最终的字符串长度就是第2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_子串_24个1的前缀1到第2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_后缀_25个后缀1之间的距离。
    对于0变1的情况同理。
  • 2020牛客寒假算法基础集训营1——H.nozomi和字符串【字符串 & 贪心】_算法_26

AC-Code

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

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;
}
}


举报

相关推荐

0 条评论