1415: 小ho的01串 [字符串]
时间限制: 1 Sec 内存限制: 128 MB提交: 188 解决: 78 统计
题目描述
有一个由0和1组成的字符串,它好长呀--------一望无际
恩,说正题,小ho的数学不太好,虽然是学计算机的但是看见0和1也是很头疼的,
现在他的老师想让他计算出来包含K个1的子串有多少个-----呀,头要炸了!!!
小ho知道你的数学棒棒哒,所以来找你帮忙了。
输入
第一行是一个数K。
第二行是一个字符串str。
0 < |str| ≤ 106
输出
一个数S,代表了满足条件的个数。
样例输入
2
101010
样例输出
6
用尺取法 方便省时 每次遍历会超时
首先说一下怎么计算 1 1 字串的数量
如 0 1 0 1 0 0
左边一个0 右边 2个0 所以 左边可取 0 或者1个 0 2中取法 右边 2 个0 可取 0 1 2个 0 三种取法
因此 总数量为 左边× 右边 2*3=6 一共有6 种取法
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[100001];
int n,s,i=0,l=1,k=1;
long long ans=0;
int b[100001]={-1}; // 一定要用 -1 不然 首项为1 的时候 第一个节点为0
cin>>n>>a;
for(int j=0;j<strlen(a);j++){
if(a[j]=='1'){
i++; //记录 1的 节点位子和1 的数量
b[l++]=j;
}
if(i==n+1){
ans+=(b[k]-b[k-1])*(b[l-1]-b[l-2]);
k++; //尺子移动
i--;
}
}
if(i==n){ //不能忘结尾
ans+=(b[k]-b[k-1])*(strlen(a)-b[l-1]);
}
cout<<ans<<endl;
return 0;
}
本文介绍了一种使用尺取法高效计算包含特定数量1的子串的方法,并提供了一个C++实现示例。
308

被折叠的 条评论
为什么被折叠?



