HDU 2617 Happy 2009——字符串,计数器什么的

计数器就可以了系列。。。。前几天也做过一道括号匹配的题目,我好像还没发上来,也是这种思路。

按照正常思路,把所有的字符串读入,然后从前面开始减去“happy”,每去掉一个计数器加1。

——结果:华丽丽的超时了。

Problem Description

No matter you know me or not. Bless you happy in 2009.

Input

The input contains multiple test cases.

Each test case included one string. There are made up of ‘a’-‘z’ or blank. The length of string will not large than 10000.

Output

For each test case tell me how many times “happy” can be constructed by using the string. Forbid to change the position of the characters in the string. The answer will small than 1000.

Sample Input

1
2
3
4
5
hopppayppy happy

happ acm y

hahappyppy

Sample Output

1
2
3
4
5
2

1

2

Author

yifenfei

Source

奋斗的年代


然后发现,其实只要简单的在读到一个h之后给计数器1加1,读到一个a,如果前面已经有一个h了,那么计数器2加1。

坑爹的是happy里有两个p啊。。。。。。。。

然后我就发现了其实没有关系,除以二就行了嘛。

于是就有了以下的版本(注释的部分)——然后,再次华丽丽的超时。

在解决了疑似的初始化问题后。。。。。。再次华丽丽的超时。。。。。。

最后发现,我把strlen(s)提到for循环外面之后,顿时就好了。。。。。。。

にまあぁHDU你们不能开个优化啊。。。。

代码是Accepted的。其中被注释包裹着的代码是坑到我的部分——

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//HDU happy 2009 
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(int agrc,char *agrv[]){
char s[10086];
int f[4];
while(gets(s)){
//又被初始化坑到了。
/******初始化开始******/
for(int i=0;i<4;i++) f[i]=0;
/******初始化结束******/
int len=strlen(s);


/***********让我超时两次的大坑********/
//for(int i=0;i<strlen(s);i++){
/*******************************************/


for(int i=0;i<len;i++){
switch(s[i]){
case 'h':
f[0]++;break;
case 'a':
f[1]+=f[0]>f[1]?1:0;break;
case 'p':
f[2]+=f[1]>(f[2]/2)?1:0;break;
case 'y':
f[3]+=(f[2]/2)>f[3]?1:0;break;
}
}
cout<<f[3]<<endl;
}
}