hdu5056(找相同字母不出现k次的子串个数)
题意:
给你一个字符串,然后问你这个字符串里面有多少个满足要求的子串,要求是每个子串相同字母出现的次数不能超过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次的子串个数)的更多相关文章
- 【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈
这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的 ...
- hdu 5056 所有字母数都<=k的子串数目
<a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=5056" style="font ...
- 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...
- 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数
一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...
- 前端算法题:找出数组中第k大的数字出现多少次
题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...
- hdu 5008 查找字典序第k小的子串
Boring String Problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- 计蒜客 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 ...
- 求二叉树第K层的节点个数+求二叉树叶子节点的个数
size_t _FindLeafSize(Node* root) //求二叉树叶子节点的个数 { //static size_t count = 0; if ...
- HDU 5056 Boring count(不超过k个字符的子串个数)
Boring count Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
随机推荐
- [Elementary Mechanics-01]Two masses and a spring
[Elementary Mechanics Using Python-01] Question 5.28 Two masses and a spring. Two particles of m = 0 ...
- 理解函数式编程中的函数组合--Monoids(二)
使用函数式语言来建立领域模型--类型组合 理解函数式编程语言中的组合--前言(一) 理解函数式编程中的函数组合--Monoids(二) 继上篇文章引出<范畴论>之后,我准备通过几篇文章,来 ...
- 漫漫Java路1—基础知识2—注释和命名规则
## 注释 1. 单行注释 ```java //这是一个注释 ``` 2. 多行注释 ```java /* 这是一个注释 */ ``` 3. 文档注释 ```java /** * * * */ ``` ...
- Cai Xukun and Orz Pandas Gym - 102309C
题目链接:https://vjudge.net/problem/Gym-102309C 题意:给定蔡徐坤投篮的位置和篮筐的位置以及最大初速度,求一个初速度和时间. 思路:一开始我以为要用到二分,后面仔 ...
- 打造云原生大型分布式监控系统系列文章-腾讯工程师roc
附上本系列文章链接 打造云原生大型分布式监控系统(一): 大规模场景下 Prometheus 的优化手段 打造云原生大型分布式监控系统(二): Thanos 架构详解 打造云原生大型分布式监控系统(二 ...
- Java单例模式实现,一次性学完整,面试加分项
单例模式是设计模式中使用最为普遍的一种模式.属于对象创建模式,它可以确保系统中一个类只产生一个实例.这样的行为能带来两大好处: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而 ...
- [图论]最短网络:kruskal
最短网络 目录 最短网络 Description Input Output Sample Input Sample Output 解析 代码 Description 农民约翰被选为他们镇的镇长!他其中 ...
- java面试-生产环境服务器变慢,谈谈你的诊断思路
1.uptime:查询linux系统负载 11:16:16 系统当前时间 up 64 days, 19:23 从上次启动开始系统运行的时间3 users 连接数量,同一用户多个连接的时候算多个load ...
- 《青橙商城》day01避坑指南
1.persistence-api报红 问题: 在模块qingcheng_pojo下的pom.xml中,报红 <dependencies> <dependency> <g ...
- pandas(1):Pandas文件读取——read_excel()
目录 一.函数原型 二.功能说明 三.常用参数说明 四.总结 一.函数原型 pd.read_excel(io, sheet_name=0, header=0, names=None, index_co ...