题目大意:f[1]=f,f[2]=ff,f[3]=ffc,以后f[n]每增加1,字符串增加一个c。给出一个字符串,求最少有多少个f[]组成。(字符串首尾相连,比如:ffcf可看做cfff)
题目思路:判断多少个c,但是每个c之间必须有两个f,首尾的c也应判断首尾相连后两者之间的距离。坑点在与
1.给出的字符串中可能包含其它字符
2.严格按照gets()读入
3.若不含c,求有多少个f[2],若有多余补上一个f[1]
3.1.出题人神经病
#include<cstdio> #include<stdio.h> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define INF 0x3f3f3f3f #define MAX 1000100 #define mod 1000000007 using namespace std; char str[MAX]; int index[MAX];//存储每个c的位置 int check() { int len,i,j,ans=0,sum=0,ok=0,flag=0,cnt=1; memset(index,0,sizeof(index)); len=strlen(str); if(len==0) return -1; for(i=0;i<len;i++) { if(str[i]=='c') { index[cnt++]=i; sum++; } else if(str[i]!='c' && str[i]!='f')//存在其他字符直接返回0 return 0; } cnt--; if(sum > (len-1)/2) return 0; for(i=2;i<=cnt;i++) { if(index[i] - index[i-1] <= 2)//每个c至少相隔2个单位 return 0; } if(cnt > 1)//判断收尾的c之间的距离 { int k=len-(index[cnt]-index[1]);// if(k <= 2) return 0; } if(sum==0)//如果没有c,求str中有多少个f【2】,不够上一个补f【1】 { return (len+1)/2; } return sum; } int main() { int T,ans,cnt=1; scanf("%d",&T); getchar(); while(T--) { gets(str); ans=check(); if(ans==0) ans=-1; else if(ans==-1) ans=0; printf("Case #%d: %d\n",cnt++,ans); } return 0; }