codeforces 165C Another Problem on Strings 双指针
2016-09-03 20:45
399 查看
题意:求对于给定01字符串,有多少个子串,其恰好包含了k个1
双指针,把每个1都找出来,统计这个1之后有多少个0
然后用乘法原理计算
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define rep(i, j, k) for(int i = j; i <= k; i++)
using namespace std;
typedef long long lo;
char buff[1001000];
lo l[1001000];
int main() {
lo sum=0,k, count=0, ptr=0;
cin >> k >> buff;
lo n=strlen(buff);
for (lo i=0;i<n;i++) {
l[ptr]++;
if (buff[i]=='1') ptr++;
}
l[ptr]++;
if (k==0)
for (lo i=0;i<=ptr;i++)
(count+=(l[i]-1)*(l[i]-2)/2 + l[i]-1);
else
for (lo i=0;i+k<=ptr;i++)
count+=(l[i])*(l[i+k]);
cout << count;
return 0;
}
双指针,把每个1都找出来,统计这个1之后有多少个0
然后用乘法原理计算
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define rep(i, j, k) for(int i = j; i <= k; i++)
using namespace std;
typedef long long lo;
char buff[1001000];
lo l[1001000];
int main() {
lo sum=0,k, count=0, ptr=0;
cin >> k >> buff;
lo n=strlen(buff);
for (lo i=0;i<n;i++) {
l[ptr]++;
if (buff[i]=='1') ptr++;
}
l[ptr]++;
if (k==0)
for (lo i=0;i<=ptr;i++)
(count+=(l[i]-1)*(l[i]-2)/2 + l[i]-1);
else
for (lo i=0;i+k<=ptr;i++)
count+=(l[i])*(l[i+k]);
cout << count;
return 0;
}
相关文章推荐
- Codeforces 710 E. Generate a String (dp)
- Atlantis(离散化)
- C++ 对象的内存布局(上)
- 从决策树学习谈到贝叶斯分类算法、EM、HMM
- IntentService的源码分析
- 哈理工OJ 1681“回文串”
- Linux 下编译C语言
- 错误“AxImp.exe”已退出,代码为 -1163019603【转载及个人看法】
- BGRABitmap图像操作6:前面的长方形改成既有圆角又有尖角
- IP问题(1)
- Caffe学习笔记(六)—— Windows下训练自己的数据
- UVa1583 - Digit Generator 生成元 (java版本)
- [leetcode] Maximum Subarray
- 关于javaEE的web项目——WEB-INF
- ios属性和实例变量
- 堆和栈的区别
- CVTE面试总结
- BroadCast Receiver的使用
- 魔都一月记
- 完美世界运营培训生内推笔试题