解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态。先打一个斐波那契数的表,f[1] = 1,f[2] =2....,然后从前往后扫一遍字符串,将一段连在一起的"he"一起计算,若这一段里面有 n 个 "he" ,然后这一段就有f[n]种不同的形态,然后一直这样扫下去,把每一段的状态数都相乘,就是最后的结果,不过,要注意的是用到斐波那契数如果不取模的话,一定会爆 int 所以打表的时候每一步都要取摸,并且相乘的时候每一步也要取模。
1 #include<cstdio> 2 #include<cstring> 3 const int MAX = 10090,MOD = 10007; 4 int f[MAX]; 5 void dabiao() { 6 f[0] = f[1] = 1; 7 f[2] = 2,f[3] = 3; 8 for(int i = 4;i<MAX;++i) 9 f[i] = (f[i-1]%MOD + f[i-2]%MOD)%MOD; 10 } 11 int main() { 12 int T,l = 1; 13 char S[MAX]; 14 dabiao(); 15 scanf("%d",&T); 16 while(T--) { 17 scanf("%s",S); 18 int len = strlen(S); 19 int tot = 0,sum = 1; 20 for(int i = 0;i<len;++i) { 21 if(S[i] != 'h') { 22 sum = sum*f[tot]%MOD; 23 tot = 0; 24 } 25 else if(S[i] == 'h' &&S[i+1] == 'e') { 26 i++; 27 tot++; 28 } 29 } 30 sum = sum*f[tot]%MOD; 31 printf("Case %d: %d ",l++,sum); 32 } 33 return 0; 34 }