您的位置:首页 > 其它

HDU 5455

2015-09-19 21:15 309 查看

Fang Fang

Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 278 Accepted Submission(s): 127



[align=left]Problem Description[/align]
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.

[align=left]Input[/align]
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.

[align=left]Output[/align]
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.

[align=left]Sample Input[/align]

8
ffcfffcffcff
cffcfff
cffcff
cffcf
ffffcffcfff
cffcfffcffffcfffff
cff
cffc


[align=left]Sample Output[/align]

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".


[align=left]Source[/align]
2015 ACM/ICPC Asia Regional Shenyang Online

[align=left]Recommend[/align]
wange2014 | We have carefully selected several similar problems for you: 5462 5460 5459 5458 5457

本题坑点,存在其他字符时输出-1;

空行输出 0;

题意:输出最小的F的个数,字符串可以构成环的,即前面的字符可以接到后面去.

S

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;

char s[1000010],s1[1100000];
int main()
{
int T;
while(~scanf("%d%*c",&T))
{
for(int Case=1; Case<=T; Case++)
{
int flag=0;
gets(s);
if(strlen(s)==0)
{
printf("Case #%d: 0\n",Case);
continue;
}
int num=0;
int i,len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]!='f'&&s[i]!='c')
{
printf("Case #%d: -1\n",Case);
flag=1;
break;
}
}
if(flag)
continue;
for(i=0; i<len; i++)
{
if(s[i]!='f')
{
break;
}
}
int sum=0;
if(i==len)
{
sum=len%2;
sum+=len/2;
}
else
{
for(int j=i; j<len; j++)
{
s1[num++]=s[j];
}
for(int j=0; j<i; j++)
s1[num++]='f';
s1[num]='\0';
//cout<<'$';
for(int j=0; j<len; j++)
{
//cout<<s1[j];
if(s1[j]=='c'&&(s1[j+1]!='f'||s1[j+2]!='f'))
{
printf("Case #%d: -1\n",Case);
flag=1;
break;
}
else if(s1[j]=='c'&&(s1[j+1]=='f'&&s1[j+2]=='f'))
{
sum++;
}
}
}
if(flag==0)
printf("Case #%d: %d\n",Case,sum);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: