题目大意:给出一个字符串,问这个字符串是不是"ABABA"或“ABABCAB”这种形式字符串。要求子字符串两两不相同
解题思路:因为字符串最长50,所以直接暴力
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 60
char str[maxn], str2[maxn];
int main() {
int test;
scanf("%d", &test);
while(test--) {
scanf("%s", str);
int len = strlen(str);
int cnt = 0;
for(int i = 0; i < len; i++)
if((str[i] >= 'A' && str[i] <= 'Z') || (str[i] <= 'z' && str[i] >= 'a'))
str2[cnt++] = str[i];
str2[cnt] = '\0';
bool flag = false;
int i , j, k, l;
for(int A = 1; A < cnt; A++) {
if( (cnt - 3 * A) <= 1)
break;
if( (cnt - 3 * A) % 2 != 0)
continue;
int B = (cnt - 3 * A) / 2;
if(A == B) {
for(i = 0; i < A; i++)
if(str2[i] != str2[A+i])
break;
if(i == A)
continue;
}
for(i = 0; i < A; i++)
if( str2[i] == str2[i+A+B] && str2[i] == str2[i+A+B+A+B] )
continue;
else
break;
if(i != A)
continue;
for(j = 0; j < B; j++)
if(str2[A+j] == str2[A+B+A+j])
continue;
else
break;
if(i == A && j == B) {
flag = true;
break;
}
}
if(!flag) {
for(int A = 1; A < cnt; A++) {
if(cnt - 3 * A < 4)
break;
for(int B = 1; ; B++) {
if((cnt - 3 * A - 3 * B) < 1)
break;
int C = cnt - 3 * A - 3 * B;
if(A == B) {
for(i = 0; i < A; i++)
if(str2[i] != str2[A+i])
break;
if(i == A)
continue;
}
if(A == C) {
for(i = 0; i < A; i++)
if(str2[i] != str2[2 * A + 2 * B + i])
break;
if(i == A)
continue;
}
if(C == B) {
for(i = 0; i < B; i++)
if(str2[i+A] != str2[2*A +2 * B + i])
break;
if(i == B)
continue;
}
int D = A + B;
for(i = 0; i < D; i++)
if(str2[i] == str2[i+D] && str2[i] == str2[cnt - D + i])
continue;
else
break;
if(i == D) {
flag = true;
break;
}
}
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}