一开始已经看不下去了,一直一直不懂,对着这道呵呵的题只能说呵呵了。
思路:后面小d讲的思路,一开始递推发现好像是斐波那契数列每一个,每一串中的每一个hehe你可以选择变还是不变,当你变了就是相当是一个i-1;的子串当你没变的时候就 是 一个i-2;
状态方程写下来dp[i]=dp[i-1]+dp[i-2];而当你把所有的情况都乘起来的时候就是结果了。因为长度是10086,he两个字符so只需开一半的空间即可。
#include <math.h>
#include <queue>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int xx=1e6;
char str[20000];
int cur[xx];
void fibonacci()
{
cur[0]=1;cur[1]=1;cur[2]=2;cur[3]=3;
for(int i =4; i<5090;i++)
{
cur[i]=(cur[i-1]+cur[i-2])%10007;
}
}
int main()
{
int T,ncase=0;
scanf("%d", &T);
fibonacci();
while(T--)
{
scanf("%s", str);
int len =strlen(str);
int ans=0,cout=1;
for(int i=0; i<len-1;){
if(str[i]=='h'&&str[i+1]=='e')
{
ans++;
if(i+2<len)
{
i+=2;
continue;
}
break;
}
cout=(cout*cur[ans])%10007;
i++;
ans=0;
}
cout=(cout*cur[ans])%10007;
printf("Case %d: %d\n",++ncase,cout);
}
return 0;
}