Fang FangTime Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 403 Accepted Submission(s): 175
Problem Description
Fang Fang says she wants to be remembered.
I promise her. We define the sequence F of strings. F0 = ‘‘f", F1 = ‘‘ff", F2 = ‘‘cff", Fn = Fn−1 + ‘‘f", for n > 2 Write down a serenade as a lowercase string S in a circle, in a loop that never ends. Spell the serenade using the minimum number of strings in F , or nothing could be done but put her away in cold wilderness.
Input
An positive integer
T
, indicating there are
T
test cases.
Following are T lines, each line contains an string S as introduced above. The total length of strings for all test cases would not be larger than 106 .
Output
The output contains exactly
T
lines.
For each test case, if one can not spell the serenade by using the strings in F , output −1 . Otherwise, output the minimum number of strings in F to split S according to aforementioned rules. Repetitive strings should be counted repeatedly.
Sample Input
Sample Output
|
我也是醉了,提交3次过,CE2次。杭电O__O "…
字符串F[0] = f,F[1] = ff,F[2] = cff,F[n] = F[n-1] + f。
题意:给你一个成环的字符串str,现在问你串str能否由F串组成,若不可以输出-1,反之输出组成str串需要的最少的F串。
没有坑的题都简单。。。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1000000+10
using namespace std;
char str[MAXN];
int main()
{
int t, k = 1;
scanf("%d", &t);
while(t--)
{
scanf("%s", str);
int len = strlen(str);
bool flag = true;
int pos = -1;
for(int i = 0; i < len; i++)
{
if(str[i] != 'c' && str[i] != 'f')//其它字符出现
{
flag = false;
break;
}
if(pos != -1)
continue;
if(str[i] == 'c')
pos = i;//第一个c出现的位置
}
printf("Case #%d: ", k++);
if(!flag)//其它字符出现
{
printf("-1\n");
continue;
}
int num;//组成串的最少个数
if(pos == -1)//c没有出现
{
num = len / 2;
if(len & 1)
num++;
printf("%d\n", num);
continue;
}
for(int i = 0; i < pos; i++)
str[len++] = 'f';
str[len] = '\n';//把字符f放在后面
num = 0;
for(int i = pos; i < len;)
{
if(!flag)//不能组成
break;
if(str[i] == 'c')
{
int sum = 0;//记录c后面f的个数
i++;
while(str[i] == 'f' && i < len)
{
sum++;
i++;
}
if(sum <= 1)
{
flag = false;
break;
}
num++;
}
}
if(flag)
printf("%d\n", num);
else
printf("-1\n");
}
return 0;
}