hdu5455 Fang Fang(沈阳网赛)

来源:互联网 发布:mac免费的视频播放器 编辑:程序博客网 时间:2024/04/28 07:30

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.
F0=f",
F1=ff",
F2=cff",
Fn=Fn1+f",forn>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
8ffcfffcffcffcffcfffcffcffcffcfffffcffcfffcffcfffcffffcfffffcffcffc

Sample Output
Case #1: 3Case #2: 2Case #3: 2Case #4: -1Case #5: 2Case #6: 4Case #7: 1Case #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".

Source
2015 ACM/ICPC Asia Regional Shenyang Online 

题意:找出所给字符串有多少个满足题目所给条件的子串。
分析:先找到第一个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;}


0 0
原创粉丝点击