Fang Fang
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 518 Accepted Submission(s): 227
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
8
ffcfffcffcff
cffcfff
cffcff
cffcf
ffffcffcfff
cffcfffcffffcfffff
cff
cffc
Sample Output
Case #1: 3
Case #2: 2
Case #3: 2
Case #4: -1
Case #5: 2
Case #6: 4
Case #7: 1
Case #8: -1
Hint
Shift the string in the first test case, we will get the string "cffffcfffcff" and it can be split into "cffff", "cfff" and "cff". 注意:会出现cf之外的其他字符,这是当时写的 代码有点丑,见谅 ac代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define INF 0xfffffff
using namespace std;
char s[1000100];
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int bz,n,v;
int cas=0;
int i,j,flag,num;
int sum;
scanf("%d",&n);
while(n--)
{
bz=0;
flag=0;
scanf("%s",s);
int len=strlen(s);
int q=0;
for(i=0;i<len;i++)
{
if(s[i]!='c'&&s[i]!='f')
{
bz=1;
break;
}
if(s[i]=='f')
q++;
}
printf("Case #%d: ",++cas);
if(q==len)
{
if(q%2)
printf("%d\n",q/2+1);
else
printf("%d\n",q/2);
continue;
}
if(bz)
{
printf("-1\n");
continue;
}
int num;
sum=0;
if(s[0]=='c')
{
v=1;
}
else
{
v=2;
}
for(i=0;i<len;)
{
if(s[i]=='f')
{
i++;
continue;
}
if(s[i]=='c')
{
num=0;
i++;
while(s[i]=='f'&&i<len)
num++,i++;
if(i==len)
{
if(v==2)
{
j=0;
while(s[j]=='f'&&j<len)
num++,j++;
}
}
if(num<2)
{
flag=1;
break;
}
else
{
sum++;
}
}
}
if(flag)
printf("-1\n");
else
printf("%d\n",sum);
}
return 0;
}