ZOJ 3818 Pretty Poem (暴力模拟 string(substr))

来源:互联网 发布:麦田的守望者 知乎 编辑:程序博客网 时间:2024/05/29 20:03


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

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




0 0