HDU 5455 Fang Fang | 思维

题意:有一种芳芳字符串,有f,ff,cff,cfff,cffff……种。从第三种开始就是在前者基础上添加一个f。这些芳芳字符串放在一起组成了芳芳小夜曲,众所周知,乐章是可以循环的。所以ffcffffc与cffffcff是一回事。现在,提供给你一份乐谱,请你判断这是不是芳芳小夜曲。如果不是,输出-1,如果是,输出最少使用的芳芳字符串。

最开始没注意到loop,circle的描述,只看到Hint那里的shift,以为是可以随便交换字母顺序,就直接统计了c f数量。最狗屎的是样例还都对了,所以完全没发现是读错题了(掀桌

首先分析一下芳芳字符串,要么是只有f,那就是f,ff两类;要么就是c+f类型,其中至少有两个f。
我们可以从前向后扫描芳芳字符串,如果每两个c之间间距小于2,那么一定不是芳芳小夜曲。在实际进行的过程中要考虑几个特殊情况:

  • 全为f。奇数个必然是偶数个ff+一个f,偶数个就都由ff构成。所以是(totalf+1)/2
  • 出现c f之外的其他字符。(真的坑)

然后就可以开始写代码了。
还有一个地方坑到我了。检查c之间间距的时候,记录上一个c的位置lastc,但是i-lastc不能设置为<2,而应<3。2的情况是不合法的,因为,下标5和下标7,相减为2,但实际上只间隔了一个数……

#include <bits/stdc++.h>

using namespace std;

#define MAX_N 1000010
//1e6
int T;

int main()
{
    scanf("%d", &T);
    for(int q = 1;q <= T;q++)
    {
        getchar();

        char scontainer[MAX_N];
        scanf("%s", scontainer);


        int len = strlen(scontainer),
        otherflag = 0, ans = 0, fflag = 0, cpos = 0;

        //printf("len = %d\n", len);

        for(int i = 0;i < len;i++)
        {
            //printf("here11\n");
            //出现其他字符
            if(scontainer[i] != 'c' && scontainer[i] != 'f')
            {
                otherflag = 1;
                ans = -1;
                break;
            }
            if(scontainer[i] == 'c')
            {
                fflag = 1;
                cpos = i;
                break;
            }
        }


        //均为c f
        if(!otherflag)
        {
            //printf("here11\n");

            //不存在c
            if(!fflag)
                ans = (len+1)/2;

            else//存在c 存在f
            {
                //printf("here22\n");


                int fsum = 0, lastc = -99999;

                //printf("cpos = %d\n", cpos);

                for(int i = cpos;i < len;i++)
                {

                    //printf("i = %d\n", i);

                    if(scontainer[i] == 'f')
                        fsum++;

                    else//='c'
                    {
                        /****/
                        if((i - lastc) < 3)//5 7 cfc i-lastc = 2
                        {
                            ans = -1;
                            break;
                        }
                        fsum = 0;
                        ans++;
                        //printf("i = %d  ans = %d\n", i, ans);
                        lastc = i;
                        //下面要考虑 ffc这种类型
                    }
                }

                //fsum剩余f
                if(fsum + cpos < 2)
                    ans = -1;
            }
        }

        printf("Case #%d: %d\n", q, ans);
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值