• [1665] 夜神的思考

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • 最近夜神对二进制很感兴趣,于是他每次看到一串只包含1和0的字符串的时候就会想,这串字符串有多少子串是含有k个1的呢。

    你们能不能快速的解决这个问题。

  • 输入
  • 输入数据包含多组,先输入k ( 0 =< k <= 10^6 ) , 再在接下来的一行输入一串只包含1和0的字符串,字符串的长度不超过10^6.
  • 输出
  • 输出一个整数,这个整数就是这串字符串有多少子串是含有k个1的。
  • 样例输入
  • 1
    1010
    2
    01010
    100
    01010
  • 样例输出
  • 6
    4
    0
  • 提示
  • 第一串字符串中,“1”,“1”,“10”,“01”,“10”,“010”都只含有一个1,所以答案输出6
    第二串字符串中,"101", "0101", "1010", "01010",都含有2个1,所以答案为4。

做法:total的前n-1个下标记录每一个1的位置,值记录对应左边0的个数(最后第n个位置再多记录一个末尾的0个数)。

例如:2    00100010  此时k=2,total={1,1,1}代表第一个1左边两个0,第二个1左边三个0,第三个1代表末尾一个0

然后分类讨论,k=0和k!=0

①、k=0比较简单,但是被坑了好多次WA,计算公式是∑(1~当前位置0的个数),例如上题若k=0,那么就是(1+2)+(1+2+3)+(1)=10,此前一直写成2^n-1让我WA了好几次....

②、k!=0,那么每次的Sum=(total[l]+1)*(total[r]+1)(其中r-l+1即距离应恒为k)

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef __int64 LL;
LL zxc(LL b)
{
LL r=0;
for (LL i=1; i<=b; i++)
{
r=r+i;
}
return r;
}
char cc[1000009];
LL total[1000009];
int main (void)
{
LL k,i,j,sum,l,r;
while (~scanf("%I64d",&k))
{
memset(cc,0,sizeof(cc));
memset(total,0,sizeof(total));
scanf("%s",cc);
LL len=strlen(cc);
LL ans=0;
LL cnt=0;
LL sum=0;
for (i=0; i<len; i++)
{
if(cc[i]=='1')
{
total[cnt++]=sum;
sum=0;
}
else
{
sum++;
}
}
total[cnt]=sum;//记录末尾0个数
if(k==0)//k==0的情况
{
for (i=0; i<=cnt; i++)
{
ans=ans+zxc(total[i]);
}
printf("%I64d\n",ans);
continue;
}
l=0;
r=k;//定义两个下标
for (i=0; r<=cnt; i++)
{
ans=ans+(total[l]+1)*(total[r]+1);
l++;
r++;
}
printf("%I64d\n",ans);
}
return 0;
}

NOJ——1665夜神的思考(YY+组合问题+分类讨论)的更多相关文章

  1. 洛谷P1246编码问题-排列组合,分类讨论

    编码问题 题意就是a,b,c.....ab.....编码,给你一个字符串,输出这是第几个: 这里可以用暴力枚举,但也可以用组合数学的高超知识: 既然这样我就说一下排列组合的方法,如果要弄一个 各位数字 ...

  2. NOJ 1643 阶乘除法(YY+小技巧)

    [1643] 阶乘除法 时间限制: 5000 ms 内存限制: 65535 K 问题描述 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1) ...

  3. noj 2069 赵信的往事 [yy题 无限gcd]

    njczy2010 2069 Accepted 31MS   224K 1351Byte G++ 2014-11-13 13:32:56.0 坑爹的无限gcd,,,尼玛想好久,原来要x对y算一次,y再 ...

  4. CodeForces - 817B(分类讨论 + 排列组合)

    题目链接 思路如下 这一题是:最菜的队伍只有三个人组成,我们只需对排序后的数组的 前三个元素进行分类讨论即可: a[3] != a[2] && a[3] != ar[1] a[3] = ...

  5. BZOJ 2729: [HNOI2012]排队 排列组合 + 高精度

    Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...

  6. AtCoder Grand Contest 017 (VP)

    contest link Official Editorial 比赛体验--之前做题的时候感觉 AtCoder 挺快的,现在打了VP之后发现还是会挂的--而且不是加载缓慢或者载不出来,直接给你一个无法 ...

  7. 博弈论题目总结(二)——SG组合游戏及变形

    SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...

  8. 设计模式之(八)组合模式(COMPOSITE)

    初始印象 在开发中存在很多整体和部分的关系,这个方式最大的体现就是树形结构.组合模式就是为了更好地解决这类业务场景的问题.先看下组合模式的定义: 将对象组合成树形结构以表示“整体—部分”的层次关系.组 ...

  9. 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)

    [HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...

随机推荐

  1. 卓越管理的实践技巧(4)如何才能给予有效的反馈 Guide to Giving Effective Feedback

    Guide to Giving Effective Feedback 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧名称 ...

  2. cookie存验证码时间,时间没走完不能再次点击

    <script> var balanceSeconds=getcookie('Num'); console.log(balanceSeconds) var timer; var isCli ...

  3. jquery的uploadify插件实现的批量上传V3.2.1版

    你需要如下配置(包括引入文件)HTML: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&quo ...

  4. polygon 画图

    cityscape数据集,我现在想根据json文件中的polygon画出整个road的区域,这是运行的脚本.这个文件必须使用coco的pythonAPI的包,把这个脚本放在pythonAPI文件夹下就 ...

  5. 脚手架创建一个React项目

    一.安装 1.安装node.js 官网地址 https://nodejs.org/en/ 进入后点击下载,官方网站会根据你的系统类型推荐最适合你安装的版本.(如果已经安装了node.js跳过此步)如下 ...

  6. VMware的centos的配置分区

    /      ext3 8189 固定大小空     swap 509  固定大小/boot  ext3 100  固定大小/home  ext3 全部(使用全部可用空间) 利用的工具   AMFTP ...

  7. Ubuntu16.04+GTX1080配置TensorFlow并实现图像风格转换

    1. TensorFlow TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,表达了高层次的机器学习计算,大幅简化了第一代系统,并且具备更好的灵活性和可延展性. Te ...

  8. 【模板】无旋Treap(FHQ)

    如题,这是一个模板... #include <algorithm> #include <iostream> #include <cstring> #include ...

  9. ubuntu系统普通用户密码忘记之重置

    当我们在使用ubuntu系统忘记普通用户登录密码的时候,会被系统在登录界面拒之门外而不得入,这时候只好需要我们去重新设置密码,具体做法如下: 系统重启,在GRUB模式下选择Advanced Optio ...

  10. 如何用纯 CSS 创作一台拍立得照相机

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YjYgey 可交互视频 此视频是可 ...