1.题目描述:点击打开链接
2.解题思路:本题是一道模拟题,输入一个串,要求判断是否形如“ABABA”或“ABABCAB”。只需要对两种情况逐一尝试即可。然而这道题有诸多细节需要考虑。这里说一下我自己的方法。
首先,如果输入的串长度<5,那么直接输出No,或者去掉所有的标点后发现长度<5,输出No。长度上没问题后,写一个专门的solve(int type)函数,来判断是否是上述情况中的一种。对于第一种,只需要枚举A的长度即可,B的长度就是(len-3*i)/2.。接下来就是对都是A串的位置逐一判断是否相等,若相同,再判断B串的位置。最后还要判断A,B串是否相等。这里我犯了一个很经典的逻辑错。如果A,B串相等,应该是continue,我一开始写成了return false。对于类型2,和类型1的判断步骤类似。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<cassert> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<cctype> #include<functional> using namespace std; #define me(s) memset(s,0,sizeof(s)) #define pb push_back typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair <int, int> P; const int N = 50 + 10; char s[N]; char t[N]; bool same(int st1,int st2,int len)//判断从st1开始和st2开始,长度均为len的两个子串是否相等 { int p = 0, equal = 1; while (p < len) { if (t[st1+p] != t[st2+ p]) { equal = 0; break; } p++; } if (equal)return true; return false; } bool solve(int type) { int len = strlen(t); if (!type) { for (int i = 1; i < len - 2 * i ; i++) { if ((len - 3 * i) % 2)continue; //len-3*i一定是偶数 int j = (len - 3 * i) / 2; int p = 0, ok = 1; while (p<i) { if (t[p] != t[i + j + p] || (t[p] != t[2 * i + 2 * j + p])) { ok = 0; break; } p++; } if (ok) { p = 0; while (p<j) { if (t[p + i] != t[2 * i + j + p]) { ok = 0; break; } p++; } if (ok) { if (i == j&&same(0, i, i))continue; //注意:不要写成了return false,否则就WARush了 return true; } } } return false; } else { for (int i = 1; i <= len - 1 - 2 * i - 3; i++) for (int j = 1; j <= len - 1 - 3 * i - 2 * j; j++) { int k = len - 3 * (i + j); if (k < 1)continue; int p = 0, ok = 1; while (p<i) { if (t[p] != t[p + i + j] || (t[p] != t[2 * i + 2 * j + k + p])) { ok = 0; break; } p++; } if (ok) { p = 0; while (p<j) { if (t[i + p] != t[2 * i + j + p] || (t[i + p] != t[3 * i + 2 * j + k + p])) { ok = 0; break; } p++; } if (ok) { if (i == j&&same(0, i, i))continue; else if (i == k&&same(0, 2 * i + 2 * j, i))continue; else if (j == k&&same(i, 2 * i + 2 * j, j))continue; return true; } } } return false; } } int main() { int T; scanf("%d", &T); while (T--) { scanf("%s", s); int len = strlen(s); if (len<5) { puts("No"); continue; } else { int kk = 0; memset(t, 0, sizeof(t)); for (int i = 0; i<len; i++) if (isalpha(s[i])) t[kk++] = s[i]; if (kk<5) { puts("No"); continue; } else { if (solve(0) || solve(1)) puts("Yes"); else puts("No"); } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
ZOJ 3818 Pretty Poem (2014年牡丹江赛区网络赛J题)
原文地址:http://blog.csdn.net/u014800748/article/details/47725143