Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 355 Accepted Submission(s): 202
我用的是组合的方法:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int mod=10007; char str[12000]; int C[1000][1000]; void init(){ for(int i=0;i<1000;i++){ C[i][i]=C[i][0]=1; for(int j=1;j<i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; } } int main(){ //freopen("input.txt","r",stdin); int t,cases=0; scanf("%d",&t); init(); while(t--){ scanf("%s",str); int cnt=0,ans=1; int len=strlen(str); for(int i=0;i<len;i++){ cnt=0; int tmp=1; while(i+1<len && str[i]=='h' && str[i+1]=='e'){ //找出每次连续在一起的he的个数 i+=2; cnt++; } if(cnt>=2){ for(int i=1;i<=cnt/2;i++){ tmp=(tmp+C[i+cnt-i*2][i])%mod; } } ans=(ans*tmp)%mod; } printf("Case %d: %d\n",++cases,ans); } return 0; }
另一种思路:
思路: 斐波那契数列
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> #include <vector> using namespace std; //斐波那契数列 const int V = 5050 + 50; const int MaxN = 500 + 5; const int mod = 10000 + 7; int T, ans, num[V]; char ch[10100]; int main() { int i, j, k; scanf("%d", &T); num[0] = num[1] = 1; for(i = 2; i <= V; ++i) num[i] = (num[i - 1] + num[i - 2]) % mod; for(i = 1; i <= T; ++i) { ans = 1; int sum = 0; scanf("%s", &ch); int len = strlen(ch); for(j = 1; j < len; ++j) { if(ch[j] == 'e' && ch[j - 1] == 'h') { sum++; j++; } else { ans = (ans * num[sum]) % mod; sum = 0; } } ans = (ans * num[sum]) % mod; printf("Case %d: %d\n", i, ans); } }