标签:zoj 暴力
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 A, 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.
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.
For each test case, output "Yes" if the poem is pretty, or "No" if not.
3 niconiconi~ pettan,pettan,tsurupettan wafuwafu
Yes Yes No
题目链接: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总是紧挨着子串A if(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"); else printf("No\n"); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:zoj 暴力
原文地址:http://blog.csdn.net/criminalcode/article/details/47361111