第一次网络赛之许杰浩题解

Pretty Poem

Time Limit: 2 Seconds       Memory Limit: 65536 KB

Poetry is a form of literature that uses aesthetic and rhythmic qualities of language. There are many famous poets in the contemporary era. It is said that a few ACM-ICPC contestants can even write poetic code. Some poems has a strict rhyme scheme like "ABABA" or "ABABCAB". For example, "niconiconi" is composed of a rhyme scheme "ABABA" with A = "ni" and B = "co".

More technically, we call a poem pretty if it can be decomposed into one of the following rhyme scheme: "ABABA" or "ABABCAB". The symbol AB and C are different continuous non-empty substrings of the poem. By the way, punctuation characters should be ignored when considering the rhyme scheme.

You are given a line of poem, please determine whether it is pretty or not.

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

There is a line of poem S (1 <= length(S) <= 50). S will only contains alphabet characters or punctuation characters.

Output

For each test case, output "Yes" if the poem is pretty, or "No" if not.

Sample Input

3

niconiconi~

pettan,pettan,tsurupettan

wafuwafu

Sample Output

Yes

Yes

No
  1 /*

  2 许杰浩的题解:

  3 AC代码:

  4 */

  5 #include <iostream>

  6 #include <cstdio>

  7 #include <string.h>

  8 #include <cstring>

  9 using namespace std;

 10 char str[55],s1[55];

 11 char s2[55],s3[55],s4[55];

 12 int cnt;

 13 void getap(){

 14     cnt=1;

 15     int l=strlen(str);

 16     for(int i=0;i<l;i++){

 17         if(str[i]<='z'&&str[i]>='a'){

 18             s1[cnt++]=str[i];

 19         }

 20         else if(str[i]<='Z'&&str[i]>='A'){

 21             s1[cnt++]=str[i];

 22         }

 23     }

 24 }

 25 void getstr(int i,int j,char *s){

 26     int p=0;

 27     for(int k=0;k<55;k++)s[k]='\0';

 28     for(int k=i;k<=j;k++){

 29         s[p++]=s1[k];

 30     }

 31 }

 32 void print(int l,int k){

 33     for(int i=l;i<=k;i++){

 34         printf("%c",s1[i]);

 35     }

 36     cout<<endl;

 37 }

 38 bool solve1(){

 39     int len=cnt-1;

 40     if(len<5)return false;

 41     for(int i=1;i<=len;i++){

 42         if(s1[i]!=s1[len])continue;

 43         if(len-i*3<2)break;

 44         if((len-i*3)%2==1)continue;

 45         int l=(len-i*3)/2;

 46         bool flag=1;

 47         for(int j=1;j<=i;j++){

 48             if(s1[j]!=s1[j+l+i]){flag=0;break;}                        //ababa    1a 2a

 49             if(s1[j]!=s1[len-i+j]){flag=0;break;}                    //ababa    1a 3a

 50         }

 51         //print(1,i);

 52         //print(i+1,i+l);

 53         if(!flag)continue;

 54         if(l==i){                                                    //ababa    a b

 55             bool ok1=0;

 56             for(int j=1;j<=i;j++){

 57                 if(s1[j]!=s1[j+i]){ok1=1;break;}

 58             }

 59             if(!ok1)flag=0;

 60         }

 61         if(!flag)continue;

 62         for(int j=1;j<=l;j++){                                        //ababa        1b 2b

 63             if(s1[j+i]!=s1[j+i*2+l]){flag=0;break;}

 64         }

 65         if(flag)return true;

 66     }

 67     return false;

 68 }

 69 bool solve2(){

 70     int len=cnt-1;

 71     if(len<7)return false;

 72     for(int i=2;i<=len;i++){

 73         if(s1[i]!=s1[len])continue;

 74         if(len-i*3<1)break;

 75         bool flag=1;

 76         //print(1,i);

 77         for(int j=1;j<=i;j++){                                                //ababcab

 78             if(s1[j]!=s1[len-i+j]){flag=0;break;}                            //ababcab  1ab 3ab

 79             if(s1[j]!=s1[i+j]){flag=0;break;}                                //ababcab  1ab 2ab

 80         }

 81         if(!flag)continue;

 82         getstr(2*i+1,len-i,s4);

 83         //print(2*i+1,len-i);

 84         for(int j=1;j<i;j++){

 85             getstr(1,j,s2);

 86             getstr(j+1,i,s3);

 87             if(strcmp(s2,s3)!=0&&strcmp(s4,s2)!=0&&strcmp(s3,s4)!=0){        //a!=b c!=a b!=c

 88                 //print(1,j);print(j+1,i);

 89                 return true;

 90             }

 91         }

 92     }

 93     return false;

 94 }

 95 

 96 int main(){

 97     int t;

 98     scanf("%d",&t);

 99     while(t--){

100         scanf("%s",str);

101         getap();

102         if(solve1()||solve2())printf("Yes\n");

103         else printf("No\n");

104     }

105 }
View Code

 

你可能感兴趣的:(题解)