题意:
给定一个字符串,问这个字符串能否组成 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;
}