[ACM] zoj 3818 Pretty Poem (2014 ACMICPC Regional 牡丹江站网络赛 J题)

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 AB 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

解题思路:

题意为输入一个只包含字母和标点符号的字符串,问该字符串是否符合 "ABABA" or "ABABCAB"的形式,其中A,B,C为原字符串中连续的不相同的子串。

比如niconiconi 符合ABABA的形式,因为 A= ni  B= con, 判断的时候要忽略掉字符串中的标点符号

思路为首先提取出来字符串中的字母,然后分别判断是否符合以上两种形式,判断ABABA的时候枚举A的长度,那么B的长度也就确定了,判断ABABCAB的时候,枚举A,B的长度,那么C的长度也就确定了。做题中出现的问题是char
s[60],输入字符串的时候用了cin>>s,一直WA,换了gets(s)以后就过了,难道测试数据中字符串包含空格?可是空格不是标点符号啊。。。

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <iomanip>
#include <cmath>
#include <string.h>
using namespace std;
#define ll long long
const int inf=0x3f3f3f3f;
int n;

int main()
{
    cin>>n;
    getchar();
    while(n--)
    {
        char s[60];
        char temp[60];
        gets(s);
        int l=strlen(s);
        if(l<5)
        {
            cout<<"No"<<endl;
            continue;
        }
        int len=0;
        for(int i=0;i<l;i++)
        {
            if((s[i]>=65&&s[i]<=90)||(s[i]>=97&&s[i]<=122))
            {
                temp[len]=s[i];
                len++;
            }
        }
        temp[len]='\0';
        if(len<5)
        {
            cout<<"No"<<endl;
            continue;
        }
        //ABABA的情况
        int la=0,lb=0;//A的长度,B的长度
        bool ok;
        for(la=1;;la++)
        {
            ok=0;
            if(len-3*la<2)
                break;
            if((len-3*la)%2!=0)
                continue;
            lb=(len-3*la)/2;
            string A="";
            string B="";
            for(int i=0;i<la;i++)
                A+=temp[i];
            for(int i=la;i<la+lb;i++)
                B+=temp[i];
            if(A==B)
                continue;

            string ans="";
            ans=A+B+A+B+A;
            int i;
            for(i=0;i<len&&ans[i]==temp[i];i++){}
            if(i==len)
            {
                ok=1;
                break;
            }
        }
        if(ok)
        {
            cout<<"Yes"<<endl;
            continue;
        }
        //ABABCAB的情况
        int lc=0;
        for(la=1;la<len-3;la++)
        {
            ok=0;
            for(lb=1;lb<len-3;lb++)
            {
                if(3*la+3*lb>=len)
                    break;
                if(len-3*la-3*lb<0)
                    break;
                lc=len-3*la-3*lb;
                string A="";
                string B="";
                string C="";
                for(int i=0;i<la;i++)
                    A+=temp[i];
                for(int i=la;i<la+lb;i++)
                    B+=temp[i];
                for(int i=(la+lb)*2;i<(la+lb)*2+lc;i++)
                    C+=temp[i];
                if(A==B||A==C||B==C)//注意这一点,ABC不能相同
                    continue;
                string ans="";
                ans=A+B+A+B+C+A+B;
                int i;
                for(i=0;i<len&&ans[i]==temp[i];i++){}
                if(i==len)
                {
                    ok=1;
                    break;
                }
            }
            if(ok)
                break;
        }
        if(ok)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}
时间: 2024-11-07 01:06:49

[ACM] zoj 3818 Pretty Poem (2014 ACMICPC Regional 牡丹江站网络赛 J题)的相关文章

[ACM] zoj 3809 The Himalayas (2014 ACMICPC Regional 牡丹江站网络赛 A题)

he Himalayas Time Limit: 2 Seconds      Memory Limit: 65536 KB As an artist, Bob usually need to travel around the world. He made a lot of sketch of scenery on his journey. A famous spot he have visited recently is the Himalayas. The Himalayas is a m

zoj 3813 Alternating Sum(2014ACMICPC Regional 牡丹江站网络赛 E)

Alternating Sum Time Limit: 2 Seconds      Memory Limit: 65536 KB There is a digit string S with infinite length. In addition, S is periodic and it can be formed by concatenating infinite repetitions of a base string P. For example, if P = 3423537, t

ZOJ 3818 Pretty Poem (2014年牡丹江赛区网络赛J题)

1.题目描述:点击打开链接 2.解题思路:本题是一道模拟题,输入一个串,要求判断是否形如"ABABA"或"ABABCAB".只需要对两种情况逐一尝试即可.然而这道题有诸多细节需要考虑.这里说一下我自己的方法. 首先,如果输入的串长度<5,那么直接输出No,或者去掉所有的标点后发现长度<5,输出No.长度上没问题后,写一个专门的solve(int type)函数,来判断是否是上述情况中的一种.对于第一种,只需要枚举A的长度即可,B的长度就是(len-3*i

【瞎搞】ZOJ 3818 Pretty Poem 牡丹江网络赛J题

第一种情况:ABABA. 先判断开头的A与结尾的A,得到A的长度,接着判断ABAB 中的AB与AB是否相同(ABAB的长度一定为偶数) 已经知道了A长度,AB的长度 接着判断下A 与B是否相同 第二种情况:ABABCAB-可先讲AB看成整体即DDCD 若存在一个D满足条件 可得到C的长度和位置再判断A-B是否相同A-C是否相同 B-C是否相同(暴力取A的长度咯) #include <stdio.h> #include <string.h> #include <stdlib.h

ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)

1.题目描写叙述:点击打开链接 2.解题思路:本题是四色定理的模板题.只是有几种情况要提前特判一下:n==1直接输出,1<n<5时候无解,n==6时候套用模板会出现同样的块.因此要特判一下.其它情况都能直接利用模板构造出来. 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<cassert> #include<string>

ZOJ 3814 Sawtooth Puzzle (2014年牡丹江赛区网络赛F题)

1.题目描写叙述:点击打开链接 2.解题思路:本题是一道隐式图的搜索题目.一般来说,这类题目首先要定义状态,接下来是弄清楚状态怎样转移,以及状态怎样判重,怎样推断当前状态是否和目标状态同样.至于求解最短路就是经常使用的BFS就可以. 接下来我们逐一展开讨论. 1.状态的定义:看到这道题,猛一下会想着把每一个字符分别用01表示,然后看成二进制码进行状态压缩,这个状态定义尽管能够,可是显然,状态过于精确和复杂,假设把一行给压缩成一个整数,那么一个完整的图案要用8*9.即72个数才干描写叙述.显然过于

HDU5006 Resistance (2014年鞍山赛区网络赛J题)

1.题目描述:点击打开链接 2.解题思路:本题利用缩点+高斯消元解决.本题的最大特点就是电阻非零即一,如果电阻为0,说明零点之间是等电位点,可以看做一个整体,自然可以想到先利用并查集进行缩点操作,将复杂的电路图转化为不相等的电位点构成的电路图.如果转换完毕后,发现s和t在一个集合中,说明两点之间是等电位的,等效电阻为0,否则,对转换后的图G'重新判断连通性,依然可以利用并查集解决,如果发现不连通,说明s与t之间开路,电阻为inf,否则,就可以根据tot个点的电位列写方程. 我们令有1A的电流从点

2014 HDU多校弟五场J题 【矩阵乘积】

题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存开辟都开不出来 1 #pragma comment(linker, "/STACK:16777216") 2 #include <iostream> 3 #include <stdio.h> 4 #define ll long long 5 using namesp

Sdut 2416 Fruit Ninja II(山东省第三届ACM省赛 J 题)(解析几何)

Time Limit: 5000MS Memory limit: 65536K 题目描写叙述 Haveyou ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja HD on the iPad and Fruit Ninja THD for NvidiaTegra 2 based Android devices) is a video game developed by Hal