Fang Fang
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 318 Accepted Submission(s): 137
Problem Description
Fang Fang says she wants to be remembered.
I promise her. We define the sequence F
of strings.
F
0
= ‘‘f",
F
1
= ‘‘ff",
F
2
= ‘‘cff",
F
n
= F
n−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.
I promise her. We define the sequence F
F
F
F
F
Write down a serenade as a lowercase string S
Spell the serenade using the minimum number of strings in F
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 10
6![]()
.
Following are T
The total length of strings for all test cases would not be larger than 10
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.
For each test case, if one can not spell the serenade by using the strings in F
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: -1HintShift the string in the first test case, we will get the string "cffffcfffcff" and it can be split into "cffff", "cfff" and "cff".
Source
题意:找出所给字符串有多少个满足题目所给条件的子串。
分析:先找到第一个c,然后把字符串扫一遍,c后面的 f 数大于等于2计数器加 1 。注意:字符串里可以有除c和 f 以外的字符,还有!!如果字符串全为 f ,输出并不是-1或0什么的!!!坑,题目并没有说明这一点。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define ll long long
#define CL(a) memset(a,0,sizeof(a))
char s[1000010];
int main ()
{
int T;
cin>>T;
for (int cas=1; cas<=T; cas++)
{
cin>>s;
cout<<"Case #"<<cas<<": ";
int k=0;
bool flag = false;
if (s[0]==' ')
{
cout<<"0"<<endl;
continue;
}
for (int i=0; s[i]; i++,k++)//找到第一个c
{
if (s[i]!='c'&&s[i]!='f') {flag=true; break;}
if (s[i]=='c') {break;}
}
//cout<<k<<endl;
if (s[k]=='\0')//若全为f,输出最小个数
{
cout<<k/2+k%2<<endl;
continue;
}
int cnt=0,ans=1;
for(int i=k+1; s[i]; i++)//从第一个c后面开始找
{
if (s[i]!='c'&&s[i]!='f') {flag = true; break;}
if (s[i]!='c') cnt++;
else
{
if (cnt>=2){cnt=0; ans++;}//如果c后面的f个数大于2个,加1
else {flag=true; break;}
}
}
if (k+cnt<2) flag=true;//特判,如果第一个c后面的f不足2个
if (flag) cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}