题意:
     给你一个字符串,然后问你这个字符串里面有多少个满足要求的子串,要求是每个子串相同字母出现的次数不能超过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. POJ - 3415 Common Substrings(长度不小于K的公共子串个数)

    Common Substrings 后缀数组+单调栈 题解1 题解2 题解3 #include<cstdio> #include<cstring> #include<io ...

  2. C++100w个数中找出最大的前K个数

    /*100w个数中找出最大的前K个数*/ #include <iostream> using namespace std; #include <assert.h> const ...

  3. 《剑指offer》给定一颗二叉搜索树,请找出其中的第k大的结点。

    题目:给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 解析:看到我写的下面的代码,像一篇文章一样的长, ...

  4. 剑指offer_输入n个整数,找出其中最小的K个数

    最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 本题无非就是排序,取前K个值.但选什么排序算法呢? ...

  5. java笔试题:海量数据找最大或最小的k个数(堆排序)

    题目 海量数据找最大或最小的k个数,这里以找最小的K个数为例 堆排序 例如给一个数组nums[]这棵树就是完全二叉树,则: nums[i]的左节点为:num[2 * i + 1] nums[i]的右节 ...

  6. 找出数组中第k大和第m大的数字之和

    找出数组中第k大和第m大的数字之和 说明:定义一个函数,接受三个参数getMaxNumber(array,k,m){},找出第k大和第m大的数字之和.重复的数组也需要计算 比如:[1,3,4,5,4, ...

  7. 找出数组中第k大小的数,输出数所在的位置

    找出数组中第k大小的数,输出数所在的位置 /*写一段程序,找出数组中第k大小的数,输出数所在的位置.例如{2,4,3,4,7}中,第一大的数是7,位置在4. 第二大.第三大的数都是4,位置在1.3随便 ...

  8. 分治法 第3关:找出数组中第 k 个小的元素

    任务描述 本关任务:对于给定的 n 个元素的数组a[0:n-1],要求从中找出第 k 小的元素. 编程要求 请在右侧编辑器Begin-End处补充代码,完成本关任务,注意需要学生自己获取输入数据再进行 ...

  9. (C/C++)给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数

    给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数 思路 logm+logn即可推断是分治,每次折半得到两个数组的A[midA]和B[midB],有: A[midA ...

最新文章

  1. php查询性能提升,php – Mysql查询提高性能
  2. pta两个有序链表的合并_21. 合并两个有序链表
  3. css3 使用SVG做0.5px 的边框细线
  4. File文件操作(二):内存映射
  5. redis报错:jedis connection exception unexpected end of stream
  6. sublime text 3配置Kotlin
  7. 30个你必须记住的CSS选择符
  8. 嵌套for in循环组合cat方式文件中包含空格问题
  9. 【vn.py学习笔记(七)】vn.py rqdata封装、datasbase等数据服务源码阅读
  10. 使用微软官方工具MediaCreationTool2004重装win10笔记(链接转发)
  11. 手机充当电脑 麦克风 扬声器 摄像头
  12. 微型计算机原理与接口技术
  13. ppt编辑数据链接文件不可用_拷过来的ppt不能编辑 - 卡饭网
  14. CAD:AutoCAD快捷键指令大全(非常值得收藏),本人项目案例实践积累总结
  15. sql字符串转时间-日期区间查询
  16. 分水岭算法的理解和应用
  17. asp获取微信小程序用户手机号,asp微信小程序手机号获取,微信小程序手机号asp获取方法
  18. 开游戏服务器要选择什么样的?
  19. 在计算机系统中对文件执行彻底删除,怎么让电脑删除文件时可以直接彻底进行删除...
  20. python实现四则运算_自动生成四则运算题目(python实现)

热门文章

  1. 201671010128 2017-11-05《Java程序设计》之集合
  2. CDH5离线安装手册
  3. android在Service,BroadCast onReceiver()中弹出Dialog对话框
  4. Response.Write详细介绍
  5. 【设计模式系列】结构型模式之Proxy模式
  6. 发布Apworks应用开发框架(Alpha版本)
  7. 04 javascirpt基础知识---听课笔记
  8. mongodb模糊查询包含特殊字符
  9. Java程序(类的抽象与封装)
  10. mysql五补充部分:SQL逻辑查询语句执行顺序