题意:给你一个字符串,其中"hehe"字段可以被替换,问这个字符串可以有多少种形态
思路:dp[i]表示到i位置,字符串可以有多少种形态。dp[i]=dp[i-1],若i和之前的3个字符恰好构成"hehe" ,则dp[i]要再加上dp[i-4]。
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int maxn=11111;
const int modd=10007;
int T,t;
long long dp[maxn];
string s;
int main()
{
cin>>T;
t=0;
while(T--)
{
cin>>s;
memset(dp,0,sizeof(dp));
dp[0]=dp[1]=dp[2]=dp[3]=1;
if(s[0]=='h' && s[1]=='e' && s[2]=='h' && s[3]=='e') dp[3]++;
for(int i=4;i<s.length();i++)
{
dp[i]=(dp[i-1]+modd)%modd;
if(s[i-3]=='h' && s[i-2]=='e' && s[i-1]=='h' && s[i]=='e')
dp[i]=(dp[i]+dp[i-4]+modd)%modd;
}
cout<<"Case "<<++t<<": "<<dp[s.length()-1]%modd<<endl;
}
return 0;
}