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
Author: JIANG, Kai
Source: The 2014 ACM-ICPC Asia Mudanjiang Regional First Round
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5350
题目大意:问除去非字母字符后剩下的字符串是不是满足ABABA或者ABABCAB的结构,其中ABC分别是不同的子串
题目分析:先得到目标字符串,然后分别枚举子串A和B,这里用到stl string里的substr函数( sub = s.substr(startpos, len) ),枚举时枚举到len / 2即可,因为AB显然可能超多len/2,剩下的就是纯粹模拟,关键是substr大法好~
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
char get[55];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", get);
string s;
bool flag = false;
int len = strlen(get);
for(int i = 0; i < len; i++)
if((get[i] >= 'A' && get[i] <= 'Z') || (get[i] >= 'a' && get[i] <= 'z'))
s += get[i];
len = s.length();
for(int i = 1; i < len / 2; i++)
{
for(int j = 1; j < len / 2; j++)
{
string A = s.substr(0, i);
string B = s.substr(i, j);
if(A == B)
continue;
if(A + B + A + B + A == s)
{
flag = true;
break;
}
if((i + j) * 3 < len)
{
string AB = A + B;
string C = s.substr((i + j) * 2, len - (i + j) * 3);
if(A == C || B == C)
continue;
if(AB + AB + C + AB == s)
{
flag = true;
break;
}
}
}
if(flag)
break;
}
printf("%s\n", flag ? "Yes" : "No");
}
}