CodeForces 165CAnother Problem on Strings(递推)

来源:互联网 发布:nginx反向代理参数说明 编辑:程序博客网 时间:2024/06/16 20:34

题意:给出一个二进制串,统计有多少中含有k个一的子串。

思路:令答案为ans,首先用数组a记录1出现的位置,用cnt代表a的个数,当1的个数大于等于k时,ans += a[cnt - k - 1] - a[cnt - k] ; 

注意:当k = 0时,特判。

#include <cstdio>#include <algorithm>#include <iostream>#include<vector>#include<cmath>#include<set>#include<cstring>#include<map>using namespace std;const int maxn = 22222;const int maxt = 100200;const int INF = 0x3f3f3f3f;const int mod = 1e9 + 7;const double pi = acos(-1.0);typedef long long ll;char s[1000010];int a[1000010];int main(){    int k;    scanf("%d%s", &k, s);    int len = strlen(s);    int cnt = 0;    ll ans = 0;    a[0] = -1;    if(k == 0){        for(int i = 0; i < len; ++i){            if(s[i] == '0') cnt++;            else{                ans += (ll)cnt * (cnt + 1) / 2;                cnt = 0;            }        }        if(cnt){            ans += (ll)cnt * (cnt + 1) / 2;        }        cout << ans <<endl;        return 0;    }    for(int i = 0; i < len; ++i){        if(s[i] == '1') a[++cnt] = i;        if(cnt >= k){            ans += (ll)(-a[cnt - k] + a[cnt - k + 1]);        }    }    printf("%I64d\n", ans);    return 0;}


1 0
原创粉丝点击