题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4639
这个题目拿到手一看,字符串,以为又要用什么后缀数组呢,原来不是
首先这个题目是“hehe”,可以替换也可以不替换,那么关键问题就是这个出现重复hehe的问题
这个题目把所有不同的也就是不连在一起的hehe串分开,计算每个能替换的数目,然后相乘法就行了
这里有个简单的DP :dp[i]=dp[i-1]+dp[i-2]
i表示出现he的次数,不是hehe的次数,这个方程还是比较好理解的
假设现在有i和:he,那么在加入最后一个he之前是i-1个he
那么就分两种情况,用这个he和不用这个he
用这个he,那么这个he就一定要和前面的he连用,那么就是dp[i-2]
如果不用,那么就和没加这个he一样就是dp[i-1],最后计算出连续he的
数目乘一下就OK了!
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define maxn 11086
#define MOD 10007
char str[maxn];
int ans[6000];
int init()
{ ans[0]=1;
ans[1]=1;
for(int i=2;i<6000;i++)
ans[i]=(ans[i-1]+ans[i-2])%MOD;
return 0;
}
int main()
{
int t,rec,cnt,k,i;
int answer;
scanf("%d",&t);
k=0;
init();
while(t--)
{
answer=1;
scanf("%s",str);
rec=0;
for(i=0;str[i]; )
{
if(str[i]=='h' && str[i+1]=='e')
{
rec++;
i+=2;
}
else
{
answer*=ans[rec];
answer%=MOD;
rec=0;
i++;
}
}
answer*=ans[rec];
printf("Case %d: %d\n",++k,answer%MOD);
}
return 0;
}
本文解析了HDU 4639题目的解题思路,通过将字符串中的hehe模式分离并计算每段可替换的数量,采用简单的DP方法解决连续模式的计数问题。
660

被折叠的 条评论
为什么被折叠?



