COJ 0036数happyは何個ありますか?

18070 ワード

happyを数えて何個ありますか?
難易度レベル:B;運転時間制限:1000 ms;運行スペース制限:51200 KB;コード長制限:200000 B
試験問題の説明
図は頭を働かすのが好きで、観察能力が強いいい学生です.最近、彼は英語の単語を勉強していて、字を練習するときに無意識に小さな英語のアルファベットを書いて、彼はこのアルファベットの中に多くのhappyが含まれていることを発見して、彼はいったいどれだけのhappyがあるかを計算することにしました.ルールは、この文字列から任意の位置の文字を抽出して新しい単語列を構成し、元の文字列の相対的な順序を変更しないようにします.プログラムを作成して、新しい単語列の種類が最大何個のhappyであるかをグラフで統計してください.
入力
入力は1行のみで、文字列が含まれています.文字列は小文字a-zで構成されています.この文字列の長さは10000を超えません.
しゅつりょく
非複素整数.タイトルに沿って記述されたルールで単語happyを構成できる最大個数を表す.
入力例
hahappyppy
出力例
2
问题解:データは水が私を见てhack彼ら!私は自分の書き方がいいと思っています...(フォグ(Fog)
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(' ')
 8 #define ENT putchar('
') 9 using namespace std; 10 inline int read(){ 11 int x=0,sig=1;char ch=getchar(); 12 while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();} 13 while(isdigit(ch))x=10*x+ch-'0',ch=getchar(); 14 return x*=sig; 15 } 16 inline void write(int x){ 17 if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; 18 int len=0,buf[15];while(x)buf[len++]=x%10,x/=10; 19 for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; 20 } 21 char ch;int cnt[4]; 22 void init(){ 23 for(ch=getchar();isalpha(ch);ch=getchar()){ 24 if(ch=='h') cnt[0]++; 25 if(ch=='a') if(cnt[1]<cnt[0]) cnt[1]++; 26 if(ch=='p') if(cnt[2]<(cnt[1]<<1)) cnt[2]++; 27 if(ch=='y') if(cnt[3]<(cnt[2]>>1)) cnt[3]++; 28 } 29 } 30 void work(){ 31 return; 32 } 33 void print(){ 34 write(cnt[3]); 35 return; 36 } 37 int main(){init();work();print();return 0;}

愚かなコードだったのか:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(' ')
 8 #define ENT putchar('
') 9 using namespace std; 10 const int maxn=10000+10; 11 int s[4][maxn],tot[4],cnt[4]; 12 int check(int d,int t){ 13 for(;cnt[d]<tot[d];cnt[d]++){ 14 if(s[d][cnt[d]]>t) return s[d][cnt[d]]; 15 } return -1; 16 } 17 inline int read(){ 18 int x=0,sig=1;char ch=getchar(); 19 while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();} 20 while(isdigit(ch))x=10*x+ch-'0',ch=getchar(); 21 return x*=sig; 22 } 23 inline void write(int x){ 24 if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; 25 int len=0,buf[15];while(x)buf[len++]=x%10,x/=10; 26 for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; 27 } 28 char ch; 29 void init(){ 30 int t=0; 31 for(ch=getchar();isalpha(ch);ch=getchar()){ 32 if(ch=='h') s[0][tot[0]++]=t++; 33 else if(ch=='a') s[1][tot[1]++]=t++; 34 else if(ch=='p') s[2][tot[2]++]=t++; 35 else s[3][tot[3]++]=t++; 36 } 37 return; 38 } 39 int ans; 40 void work(){ 41 for(int i=0;i<tot[0];i++){ 42 int t=s[0][i]; 43 if((t=check(1,t))<0)break; 44 if((t=check(2,t))<0)break; 45 if((t=check(2,t))<0)break; 46 if((t=check(3,t))<0)break; 47 ans++; 48 } 49 return; 50 } 51 void print(){ 52 write(ans); 53 return; 54 } 55 int main(){init();work();print();return 0;}