ZOJ 3813 Pretty Poem (暴力)

来源:互联网 发布:crm数据分析师招聘 编辑:程序博客网 时间:2024/05/17 04:51

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 symbolA, B 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 integerT 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

3niconiconi~pettan,pettan,tsurupettanwafuwafu

Sample Output

YesYesNo


题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3818

解题思路:字符串处理,直接暴力枚举A,B,C,直接判断是否满足两种情况。注意A,B,C各不相同,我是两种情况分类开处理,第二种 情况时把AB看成一个子串直接判断了,但还要判断AB能分解成两个不同子串子串A,B且不和C相同。

代码如下:

#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <string>#include <algorithm>#include <string>using namespace std;//const int maxn=205;int main(void){int t;scanf("%d",&t);while(t--){string s,a;cin>>s;int p=0,n=0;int len=s.length();for(int i=0;i<len;i++)if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z'){a+=s[i];n++;}for(int l1=1;l1<=n;l1++)  //第一种情况ABABA的判断{string A=a.substr(0,l1);   //子串A总是从第一个位置开始的for(int l2=1;l2<=n;l2++){if(l1+l2+l1+l2+l1>n)    //长度和大于主串,不必再往后枚举break;string B=a.substr(l1,l2);  //子串B总是紧挨着子串Aif(a==A+B+A+B+A&&A!=B){p=1;break;}}if(p)break;}if(p){printf("Yes\n");continue;}for(int l1=2;l1<=n;l1++)    //第二种情况ABABCAB的判断{string AB=a.substr(0,l1);   //把AB看成一个子串for(int l2=1;l2<=n;l2++){if(l1+l1+l2+l1>n)break;string C=a.substr(2*l1,l2);if(a==AB+AB+C+AB)       //满足条件时进一步判断AB能分解成不同的子串A和B{int lab=AB.length();for(int k=1;k<lab;k++){string A=AB.substr(0,k);string B=AB.substr(k,lab-k);if(A!=C&&A!=B&&B!=C){p=1;break;}}if(p)break;}}if(p)break;}if(p)printf("Yes\n");elseprintf("No\n");}}


0 0
原创粉丝点击