Fang Fang
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit
Status
Description
Fang Fang says she wants to be remembered.
I promise her. We define the sequence
F
of strings.
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
Input
An positive integer
T
, indicating there are
Following are
T
lines, each line contains an string
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
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”.
分析:
给出一个字符串,问最少能用几个Fn表示,输出最小数目,若果不能则输出-1。
唯一的坑点:题目有可能输入除c,f之外的字符。直接输出-1
先将前面的f记录,从第一个c开始处理,看跟在后面的f的数目是否大于等于2,最前面的f加在最后的c上。若果大于2则ans++,否则无法组成输出-1.
AC代码:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main()
{
int n,t=0;
string s;
cin>>n;
while(n--)
{
t++;
cin>>s;
cout<<"Case #"<<t<<": ";
int len = s.length();
int f=0,i,ans=0,flag=1;
for(int i=0;i<len;i++)
{
if(s[i]!='c' && s[i]!='f')
{
flag=0;
break;
}
}
if(!flag)
{
cout<<"-1"<<endl;
continue;
}
for(i=0;i<len;i++)
{
if(s[i]=='c')
break;
}
if(i>=len)
{
cout<<(len+1)/2<<endl;
continue;
}
f= i;
for(int j=i;j<len;)
{
int k;
for(k=j+1;k<len;k++)
{
if(s[k]=='c')
break;
}
int num = k-j-1;
if(k>=len)
num+=f;
if(num<2)
{
cout<<"-1"<<endl;
flag=0;
break;
}
ans++;
j=k;
}
if(flag)
cout<<ans<<endl;
}
return 0;
}