ZOJ 3818 Pretty Poem 字符串
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5350
题意:忽略标点,问该串能否构成ABABA或ABABCAB的形式,ABC均不相同。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; bool j1(int l,char *s,int n){ if(n<5)return false; //小于5不满足条件 if(l*2>=n)return false; int la=n-2*l; //la是A的长度 if(la>=l)return false; //A的长度大于等于AB,返回false for(int i=0;i<l;i++) if(s[i]!=s[i+l])return false; //AB==AB? for(int i=0;i<la;i++) if(s[i]!=s[i+2*l])return false; //A(B)==A? if(la==l-la){ //检查AB是否相等 bool bu=0; for(int i=0;i<la;i++) if(s[i]!=s[i+la])bu=1; if(bu==1)return true; else return false; }//cout<<l<<endl<<la<<endl; } bool j2(int l,char *s,int n){ if(n<7)return false; //如果小于7不满足ABABCAB形式 if(l*3>=n)return false; //C为空串 int lc=n-3*l; //LC为C的长度 for(int i=0;i<l;i++){ if(s[i]!=s[i+l]||s[i]!=s[i+n-l])return false; //判断AB==AB?,AB==(C)AB?, } for(int i=1;i<l;i++){ //枚举A的长度1~(l-1); if(i==lc){ //如果A的长度等于C bool ok=0; for(int j=0;j<i;j++) //判断A==C? if(s[j]!=s[2*l+j])ok=1; if(ok==0)continue; } if(l-i==lc){ //如果B的长度等于C bool ok=0; for(int j=0;j<l-i;j++) //判断B==C? if(s[i+j]!=s[2*l+j])ok=1; if(ok==0)continue; } if(i==l-i){ //如果A的长度等于B bool ok=0; for(int j=0;j<i;j++) //判断A==B? if(s[j]!=s[i+j])ok=1; if(ok==0)continue; } return true; } return false; } bool ok(int l,char *s,int n){ if(j1(l,s,n))return true; //判断ABABA型 if(j2(l,s,n))return true; //判断ABABCAB型 return false; } int main(){ int T; scanf("%d",&T); while(T--){ char fs[100]; //保存原串 char s[100]; //保存去掉标点的串 memset(s,'\0',sizeof(s)); scanf("%s",fs); int l=strlen(fs); int n=0; for(int i=0;i<l;i++) if(fs[i]>='a'&&fs[i]<='z'||fs[i]>='A'&&fs[i]<='Z')s[n++]=fs[i]; //去掉标点符号 bool get=0; //标记是否满足条件 for(int i = n;i>=2;i--){ //从后向前枚举AB的长度,i是AB长度 if(ok(i,s,n)){get=1;break;} } if(get==1)printf("Yes\n"); else printf("No\n"); } return 0; }