题意:有一种芳芳字符串,有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;
}