ZOJ 3818 Pretty Poem(暴力求解)

来源:互联网 发布:最新金融网络投资 编辑:程序博客网 时间:2024/06/05 07:30

题意:

给定一个字符串,问这个字符串能否组成 ABABA 或者 ABABCAB的形式。注意: A,B,C互不相同。

解析:

由于字符串的长度只有50,所以可以直接暴力枚举,A和B的长度肯定不能超过len/2,
对于 ABABA的情况可以直接枚举 A和B,判断是否满足条件。
对于 ABABCAB的情况可以通过枚举A和B求出C,然后判断是否满足条件。

AC代码

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <string>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;string A, B, C;bool judge(string str) {    int len = str.size();    string ret, AB;    for(int i = 1; i < len/2; i++) {        for(int j = 1; j < len/2; j++) {            A = str.substr(0, i);            B = str.substr(i, j);            if(A == B) continue;            AB = A+B;            ret = AB + AB + A;            if(ret == str) return true;        }    }    for(int i = 1; i < len/2; i++) {        for(int j = 1; j < len/2; j++) {            A = str.substr(0, i);            B = str.substr(i, j);            if(A == B || (i+j)*3 >= len) continue;            int posc = 2*(i+j);            int lenc = len - 3*(i+j);            C = str.substr(posc, lenc);            if(A == C || B == C) continue;            AB = A+B;            ret = AB + AB + C + AB;            if(ret == str) return true;        }    }    return false;}char buf[100];int main() {    string str;    int T;    scanf("%d", &T); getchar();    while(T--) {        gets(buf);        int len = strlen(buf);        str = "";        for(int i = 0; i < len; i++)            if((buf[i] >= 'a' && buf[i] <= 'z') || (buf[i] >= 'A' && buf[i] <= 'Z'))                str += buf[i];        printf("%s\n", judge(str) ? "Yes" : "No");    }    return 0;}
0 0
原创粉丝点击