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.
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
题目链接: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");
}
}