HDU5455 Fang Fang 模拟

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5455


题目大意:定义递推式F为f(0)='f',f(1)='ff',f(2)='cff',f(n)=f(n-1)+'f',给出一个首位相连的字符串s,问组成s至少需要多少个F,如果F不能组成s,输出-1.


分析:很明显我们有:

(1)如果字符串含有除c和f外的其他字符的话,那么输出-1,如果3倍c的数量大于字符串s的长度,也输出-1.

(2)如果字符串只含有f,那么结果为(len+1)/2,len为字符串s的长度.

(3)如果s中只含有一个c,且len大于等于3,那么结果为1.

(4)对于其他情况,我们纪录每一个c出现的位置,然后从后往前遍历,如果c[i]-c[i-1]>2的话,那么就说明这两个c之间含有大于等于2个的f,计数器加1,否则标记不可能.对于第一个c之前和最后一个c之后的部分,如果相加有大于等于2个f的话,计数器再加1,否则标记不可能。


实现代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1e6+10;
char str[maxn];
int c[maxn];
int main()
{
    int t,T=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",str);
        int len=strlen(str);
        int cnt=0;
        bool flag=true;
        for(int i=0;i<len;i++)
        {
            if(str[i]=='c') c[cnt++]=i;
            if(str[i]!='c'&&str[i]!='f') flag=false;
        }
        printf("Case #%d: ",T++);
        if(!flag||cnt*3>len)
        {
            puts("-1");
            continue;
        }
        if(!cnt)
        {
            printf("%d\n",(len+1)/2);
            continue;
        }
        if(cnt==1&&len>=3)
        {
            puts("1");
            continue;
        }
        int ans=0;
        for(int i=cnt-1;i>0;i--)
        {
            if(c[i]-c[i-1]>2) ans++;
            else
            {
                flag=false;
                break;
            }
        }
        if(c[0]+len-c[cnt-1]>2) ans++;
        else flag=false;
        if(flag) printf("%d\n",ans);
        else puts("-1");
    }
    return 0;
}


你可能感兴趣的:(HDU5455 Fang Fang 模拟)