HDOJ 5672//模拟

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5672

题意:有一个字符串S,字符串里面只包含小写字母,问有多少个子串里面有至少K个不同的字母;

思路:还是放在代码里面说会好一点,其实就是维护一个左端点和满足性质的最小右端点的过程。

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <string.h>
 6 #define N 1000100
 7 char s[N];
 8 int vis[N];
 9 int t;
10 int k;
11 int main()
12 {
13     scanf("%d",&t);
14     while(t--)
15     {
16         scanf("%s",s);
17         scanf("%d",&k);
18         int len=strlen(s);
19         memset(vis,0,sizeof(vis));//标记字母出现的次数
20         long long int cnt=0,ans=0,len1=-1,sum=0;
21         for(int i=0;i<len;i++)
22         {
23             while(cnt!=k&&len1<len)
24             {
25                 len1++;
26                 if(len1>=len)
27                     break;
28                     if(vis[s[len1]-‘a‘]==0)
29                         cnt++;//每有一个不同的那么计数器就加一
30                     vis[s[len1]-‘a‘]++;
31
32             }
33             if(len1>=len)//枚举完了就跳出
34                 break;
35                 ans=ans+(len-len1);//如果(i,j)满足这个性质,那么(i,k)(K>=J)都满足这个性质
36             if(--vis[s[i]-‘a‘]==0)//如果这个满足这个性质的子串里面这个字母只出现了一次,那么这个字母之后肯定是满足不了这个性质的,也就是不同的字母会少一个,就要重新再找一次满足性质的最小的右端点
37                     cnt--;
38         }
39         printf("%lld\n",ans);
40     }
41     return 0;
42 }

时间: 2024-11-05 22:39:48

HDOJ 5672//模拟的相关文章

hdoj 1237 模拟

计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00

HDOJ 1014 模拟

题目大意:给出两个数 ,s,m,按照题目中的要求计算生成的随机数列,判断是否生成了0~m-1这m个数列,若是则是好的选择,否则是坏的选择. 算法思想; 用一个标记flag[MAXN]来记录前0~m-1是否生成,同时用num记录数列的长度,循环判断当前的数是否先前生成过,若没有则标记,否及判断num是否等于m,若等则是一个好的选择,不等则不是一个好选择.输出时s,m均占10个字节有队齐,字符串从25列开始输出,左对齐.每个用例后空一行. 代码如下: #include <iostream> #in

HDOJ 2317. Nasty Hacks 模拟水题

Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3049    Accepted Submission(s): 2364 Problem Description You are the CEO of Nasty Hacks Inc., a company that creates small pieces of

模拟 HDOJ 4552 Running Rabbits

题目传送门 1 /* 2 模拟:看懂题意,主要是碰壁后的转向,笔误2次 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <vector> 8 using namespace std; 9 10 const int MAXN = 1e3 + 10; 11 const int INF = 0x3f3f3f3f; 12 struct Rabbit 13

模拟 HDOJ 5387 Clock

题目传送门 1 /* 2 模拟:这题没啥好说的,把指针转成角度处理就行了,有两个注意点:结果化简且在0~180内:小时13点以后和1以后是一样的(24小时) 3 模拟题伤不起!计算公式在代码内(格式:hh/120, mm/120, ss/120) 4 */ 5 /************************************************ 6 * Author :Running_Time 7 * Created Time :2015-8-13 13:04:31 8 * Fil

HDOJ 题目5097 Page Rank(矩阵运算,模拟)

Page Rank Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Submission(s): 280    Accepted Submission(s): 75 Problem Description Evaluation and rank of web pages is a hot topic for many internet companies and

hdoj 5131 Song Jiang&#39;s rank list 【模拟】

Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 653    Accepted Submission(s): 323 Problem Description <Shui Hu Zhuan>,also <Water Margin>was written by Shi Nai'

模拟+思维 HDOJ 5319 Painter

题目传送门 1 /* 2 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 3 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最小的,脑洞大 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 c

hdoj 1210 Eddy&#39;s 洗牌问题 【模拟】

题意:中文题,不翻译.. 策略:观察可知,第i张牌 如果小于等于n 那么他的序号就会变为i*2, 如果大于n 那么就会变成(i-n)*2-1  故 只需要模拟下就好了 AC by SWS 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1210 代码: #include<stdio.h> int main() { int n, cur, pre; while(scanf("%d", &n) == 1){ int ans