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

70 篇文章 0 订阅
37 篇文章 0 订阅


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




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值