题意:“hehe”可以有两种一意思,输入一个句子,问这个句子有多少种意思,共T组测试数据(T <= 100,句子长度 <= 10086,都是小写字母)。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4639
——>>找he连续出现多少次,其意思种数符合斐波那契数列,两段不连续的he之间用乘法。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10086 + 10;
const int mod = 10007;
char s[maxn], buf[maxn];
int f[maxn];
void getF(){ //斐波那契数列打表
f[0] = 1;
f[1] = 1;
for(int i = 2; i < maxn; i++){
f[i] = (f[i-1] + f[i-2]) % mod;
}
}
int main()
{
int T, kase = 1, i;
scanf("%d", &T);
while(T--){
getF();
scanf("%s", s);
int len = strlen(s), m = 0;
for(i = 0; i < len-1; i++){
if(s[i] == 'h' && s[i+1] == 'e'){
buf[m++] = 'A';
i++;
}
else buf[m++] = s[i];
}
int cnt = 0, ret = 1;
for(i = 0; i < m; i++){
if(buf[i] == 'A') cnt++;
else if(cnt != 0){
ret = ret * f[cnt] % mod;
cnt = 0;
}
}
if(buf[m-1] == 'A') ret = ret * f[cnt] % mod;
printf("Case %d: %d\n", kase++, ret);
}
return 0;
}