eli和字符串

题目描述

eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少 个相同的某个字母。
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串而言,都是其子串。而则不是它的子串。
输入描述:
第一行输入两个正整数
输入仅有一行,为一个长度为的、仅由小写字母组成的字符串。
输出描述:
如果无论怎么取都无法满足条件,输出
否则输出一个正整数,为满足条件的子串长度最小值。
示例1
输入
5 2
abeba
输出
3
说明
选择子串,长度为3,其中包含相同的两个'b'

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k;
string str;
map<char,int> mp;
int main(){
    cin>>n>>k>>str;
    int ans=-1,l=0,cnt=0;
    for(int i=0;i<n;i++){
        char c=str[i];
        mp[c]++;
        while(mp[c]==k){
            if(ans==-1) ans=i-l+1;
            else ans=min(ans,i-l+1);
            mp[str[l]]--;
            l++;
        }
    }
    printf("%d\n", ans);
    return 0;
}

nozomi和字符串

题目描述
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 01 串而言,每次操作可以把 0 字符改为 1 字符,或者把 1 字符改为 0 字符。所谓\mathit{“01”}“01”串,即只含字符 0 和字符 1 的字符串。
nozomi有最多 k 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注: k 次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。
输入描述:
第一行输入两个正整数
输入仅有一行,为一个长度为 n 的、仅由字符 0 和 1 组成的字符串。
输出描述:
一个正整数,为满足条件的子串长度最大值。
示例1
输入
5 1
10101
输出
3
说明
只有 1 次操作机会。
将第二个位置的 0 改成 1 ,字符串变成 11101,可以选出 子串,长度为 3 。
如果修改第三个或者第四个位置的字符也可以选出长度为 3 的子串。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int main() {
    int n, k;
    string s;
    cin>>n>>k>>s;
    map<bool,int>cnt;
    int ans=-1;
    for(int i=0,l=0;i<n;++i){
        ++cnt[s[i]-'0'];
        while(min(cnt[0],cnt[1])==k){
            char M;
            if(cnt[0]>cnt[1])M='0';
            else M='1';
            int j=i+1;
            for(;s[j]==M&&j<n;++j) ;
            ans=max(j-l,ans);
            --cnt[s[l++]-'0'];
        }
    }
    if(ans==-1) cout<<n<<endl;
    else cout<<ans<<endl;
    return 0;
}