zoj 3818 Pretty Poem(暴力处理字符串)2014年牡丹江赛区网络赛

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

题意:给出一个长度不超过50的字符串,判断它是不是pretty串。pretty串的定义如下:如果一个串可以写成ABABA或者ABABCAB的形式,且A、B、C两两不相等,那么这个串就是pretty串。
分析:因为长度不超过50,所以可以直接枚举A、B的长度,然后暴力求解。比赛时我枚举的是AB整体的长度,不知道为什么一直WA。取子串时,可以用substr取代循环。
#include<iostream>
#include<string>
using namespace std;

bool is_pretty1(string s)
{
    if(s.length() < 5) return false;
    for(int lenA = 1; lenA <= (s.length() - 2) / 3; lenA++) {
        string A = s.substr(0, lenA);
        for(int lenB = 1; lenA * 3 + lenB * 2 <= s.length(); lenB++) {
            if(lenA * 3 + lenB * 2 != s.length()) continue;
            string B = s.substr(lenA, lenB);
            if(A != B) {
                string AA = s.substr(lenA + lenB, lenA);
                string BB = s.substr(lenA * 2 + lenB, lenB);
                string AAA = s.substr(lenA * 2 + lenB * 2, lenA);
                if(A == AA && A == AAA && B == BB)
                    return true;
            }
        }
    }
    return false;
}

bool is_pretty2(string s)
{
    if(s.length() < 7) return false;
    for(int lenA = 1; lenA <= (s.length() - 4) / 3; lenA++) {
        string A = s.substr(0, lenA);
        for(int lenB = 1; 3 * lenA + 3 * lenB < s.length(); lenB++) {
            string B = s.substr(lenA, lenB);
            if(A != B) {
                int lenC = s.length() - 3 * lenA - 3 * lenB;
                string AA = s.substr(lenA + lenB, lenA);
                string BB = s.substr(lenA * 2 + lenB, lenB);
                string C = s.substr(lenA * 2 + lenB * 2, lenC);
                string AAA = s.substr(lenA * 2 + lenB * 2 + lenC, lenA);
                string BBB = s.substr(lenA * 3 + lenB * 2 + lenC, lenB);
                if(A == AA && A == AAA && B == BB && B == BBB && A != C && B != C)
                    return true;
            }
        }
    }
    return false;
}

bool is_pretty(string s)
{
    return is_pretty1(s) || is_pretty2(s);
}

int main()
{
    int T;
    string tmp;
    cin >> T;
    while(T--) {
        cin >> tmp;
        string s = "";
        for(int i = 0; i < tmp.length(); i++)
            if(isalpha(tmp[i]))
                s += tmp[i];
        if(is_pretty(s)) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}

时间: 2024-10-11 16:57:52

zoj 3818 Pretty Poem(暴力处理字符串)2014年牡丹江赛区网络赛的相关文章

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

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

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个数才干描写叙述.显然过于

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

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 e

ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集

Untrusted Patrol Time Limit: 3 Seconds                                     Memory Limit: 65536 KB Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory. To ensure t

HDU 4998 Rotate(计算几何)2014年鞍山赛区网络赛

Rotate                                                                           Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Special Judge Problem Description Noting is more interesting than rotation! Your litt

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

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

HDU 5002 Tree (2014年鞍山赛区网络赛F题)

1.题目描述:点击打开链接 2.解题思路:LCT的模板题 3.代码: #include <cstdio> #include <cstdlib> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int N = 111111; const int INF = 1111111111; int n, m; class LCT { p

HDU5001 Walk (2014年鞍山赛区网络赛E题)

1.题目描述:点击打开链接 2.解题思路:本题利用矩阵快速幂+概率dp解决.根据题意可以画出来一个状态转移图,根据状态转移图不难得到一步转移概率矩阵,接下来的问题是:如何求解d步之内(包括d)均无法从其他点走到结点u的概率. 首先,既然无法到达结点u,那么出发的时候就不能选择该点.其次,为了使其他结点也无法到达结点u,可以将一步转移概率矩阵中跟结点u有关的概率全部置零.即表示u结点出发无法到达其他结点,其他结点也均无法到达u结点,这样就相当于把u结点从状态转移图中暂时删去了.然后根据马氏链的知识