题意:

     给你一个字符串,然后问你这个字符串里面有多少个满足要求的子串,要求是每个子串相同字母出现的次数不能超过k。

思路:

     这种题目做着比较有意思,而且不是很难(但自己还是嘚瑟,wa了好几次),这个题目的关键就是时间问题,对于每一个字母,我们只要加上以他为结尾的满足要求的子串个数就行了,假如前面的字母出现个数都没有超过k,那么当前的可以增加的和就是之前所有的字母个数,如果当前的字母个数出现超过k了,那么就得更新起点now(这个起点就是自己作为标记可行的最前位置),ans += 当前到now的字母的个数,具体的细节看下面代码,我写个核心的部分。


int mark[] 表示的是当前可满足的区间中每个字母出现的次数

int now 表示的是当前可满足区间的最前端的下标

int now = 0;

for(int i = 0 ;i < n ;i ++)

{

    if(++mark[str[i]] > k)

    {

       int nowid = now;

       while(1)//这个别忘记了,一开始忘记了wa了好几次,挪动当前满足串的范围的时         {       //候记得挪动出去的部分的字母出现次数减出去。

          mark[str[nowid]] --;

          if(str[nowid] == str[i]) break;

          nowid ++;

       }

       now = nowid;

     }

     Ans += (i+1 - now);

}



#include<stdio.h>
#include<string.h>

char
str[110000];
int
mark[30]; int main ()
{
int
n ,t ,k;
__int64
Ans ,i ,now;
scanf("%d" ,&t);
while(
t--)
{

scanf("%s" ,str);
scanf("%d" ,&k);
n = strlen(str);
Ans = now = 0;
memset(mark ,0 ,sizeof(mark));
for(
i = 0 ;i < n ;i ++)
{
if(++
mark[str[i]-'a'] > k)
{
int
nowi = now;
while(
1)
{

mark[str[nowi]-'a'] --;
if(
str[nowi] == str[i]) break;
nowi ++;
}

now = nowi + 1;
}

Ans += (i - now + 1);
}

printf("%I64d\n" ,Ans);
}
return
0;
}

hdu5056(找相同字母不出现k次的子串个数)的更多相关文章

  1. 【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈

    这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的 ...

  2. hdu 5056 所有字母数都<=k的子串数目

    <a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=5056" style="font ...

  3. 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)

    第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...

  4. 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数

    一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...

  5. 前端算法题:找出数组中第k大的数字出现多少次

    题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...

  6. hdu 5008 查找字典序第k小的子串

    Boring String Problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  7. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  8. 求二叉树第K层的节点个数+求二叉树叶子节点的个数

    size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if ...

  9. HDU 5056 Boring count(不超过k个字符的子串个数)

    Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

随机推荐

  1. roarctf_2019_realloc_magic

    目录 roarctf_2019_realloc_magic 总结 题目分析 checksec 函数分析 解题思路 初步解题思路 存在的问题 问题解决方案 最终解决思路 编写exp exp说明 roar ...

  2. 关于win10 编辑文件时权限不足问题

    win10默认是不开启administrator账户的,所以一般是自己创建一个账户,但是此账户,可能会有些文件或文件夹,访问不了,编辑不了,这时候,只需要右键->属性->安全->编辑 ...

  3. FreeBSD ibus输入法框架配置

    FreeBSD ibus输入法框架配置 ibus输入法框架配置.xinitrc中增加XIM=ibus; export XIMGTK_IM_MODULE=ibus; export GTK_IM_MODU ...

  4. 鸿蒙OS前端开发入门指南:网络图片_Image渲染网络图片

    目录: 1.开启明文传输 2.权限申请 3.引入http插件 4.案例展示 5.<鸿蒙OS前端开发入门指南>文章合集 开启明文传输 在config.json配置文件添加如下配置(如果不开启 ...

  5. httpd解析PHP

    1.vim /usr/local/apache2.4/conf/httpd.conf 编辑httpd的主配置文件 搜索ServerName,把ServerName www.example.com:80 ...

  6. git的回滚与撤销【reset and revert】

    git的工作流程-- 3个区域 工作区:我们可以看到的文件内容 在操作 git add 之前的!! 缓存区:是不可见的  已经git add操作,还没git commit -m "" ...

  7. 归一化(Normalization)和标准化(Standardization)

    归一化和标准化是机器学习和深度学习中经常使用两种feature scaling的方式,这里主要讲述以下这两种feature scaling的方式如何计算,以及一般在什么情况下使用. 归一化的计算方式: ...

  8. Java系列教程-Spring 教程目录

    Spring 教程目录 可参考MyBatis的官方文档也比较清楚 https://mybatis.org/mybatis-3/zh/getting-started.html 代码 目录 https:/ ...

  9. go-ini入门教程

    go-ini入门教程 go-ini简介 Package ini provides INI file read and write functionality in Go. 在实际开发时,配置信息一般不 ...

  10. 【linux】驱动-6-总线-设备-驱动

    目录 前言 6. 总线-设备-驱动 6.1 概念 6.2 工作原理 6.3 总线 6.3.1 总线介绍 6.3.2 注册总线 6.4 设备 6.4.1 设备介绍 6.4.2 设备注册.注销 6.5 驱 ...