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