codeforces 165C Another Problem on Strings 二分or双指针

题意:给一个01字符串s,找出s包含恰好k个1的连续字串个数

解法:

显然是简单的双指针or二分的题,但由于k=0的存在,使得双指针的边界条件十分难写,所以应该选择二分!

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn=1000100;
const int INF=(1<<29);

int k;
ll sum[maxn];
char s[maxn];

void solve(){
    scanf("%s",s+1);
    int n=strlen(s+1);
    sum[0]=0;
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+s[i]-'0';
    ll res=0;
    for(int i=1;i<=n;i++){
        int l=lower_bound(sum+i,sum+n+1,k+sum[i-1])-sum;
        int r=upper_bound(sum+i,sum+n+1,k+sum[i-1])-sum;
        if(l==n+1) break;
        res+=r-l;
    }
    cout<<res<<endl;
}

int main(){
    // freopen("in.txt","r",stdin);
    while(cin>>k) solve();
    return 0;
}
View Code

 

posted on 2020-08-13 16:42  KEZ  阅读(55)  评论(0)    收藏  举报

导航