题意:给定一个只包含1和0的串,问其中恰好包含k个1的字串的个数
思路:开始还以为是道字符串的题肯定很麻烦连看都没看,训练完补题就后悔了...没想到字符串还能这么做
num[i]里面存的数表示从串首开始恰好有i个1的串的个数。
比如k=2,那么每次我们遇到一个有三个1的串,就相当于遇到了含一个1的串的个数个2个1的串。因为三个1的串剪掉从首开始一个1的串就是含两个1的串了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <algorithm>
#define ll long long
#define max_ 50
using namespace std;
int num[1000010];
int main(int argc, char const *argv[]) {
ll k;
string s;
cin>>k>>s;
ll ans=0,cnt=0;
num[0]=1;
for(int i=0;i<s.size();i++)
{
if(s[i]=='1')
cnt++;
if(cnt>=k)
ans+=num[cnt-k];
num[cnt]++;
}
cout<<ans<<endl;
return 0;
}