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
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"); } }