思路:对于“ABABA”可以先枚举“AB”,然后检查下一个串是否等于“AB”,剩下的串就是A,最后检查A和B是否相等;对于“ABABCAB”,同样枚举“AB”,然后匹配剩下两个“AB”,剩下的就是C,注意判断A、B、C三者是否相等。写这题一定要细心,容易写错。
AC代码
#include <cstdio> #include <cmath> #include<cctype> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <iostream> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> typedef long long LL; typedef vector<char> v; const int maxn = 200 + 5; char a[maxn]; bool is_same(int st1, int st2, int n) { int flag = 1; for(int i = st1, j = st2; i < st1+n; ++i, ++j) { if(a[i] != a[j]) { flag = 0; break; } } if(flag) return true; return false; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%s", a); int n = 0; for(int i = 0; a[i] != '\0'; ++i) { if(isalpha(a[i])) { a[n++] = a[i]; } } int flag = 0; //ABABA if(n >= 5) for(int i = 2; i <= n/2; ++i) { //枚举AB if(i*2 == n || i <= n - 2*i) continue; int ok = 1; for(int j = i, k = 0; k < i; ++j, ++k) { if(a[k] != a[j]) { ok = 0; break; } } if(ok) { for(int j = i*2, k = 0; j < n; ++j, ++k) { if(a[j] != a[k]) { ok = 0; break; } } } if(ok && n-2*i == i - (n-2*i)) { ok = !(is_same(0, n-2*i, n-2*i)); } if(ok) { flag = 1; break; } } //ABABCAB if(!flag && n >= 7) { for(int i = 2; i <= n/3; ++i) { if(i*3 == n) continue; int ok = 1; if(!is_same(0, i, i)) ok = 0; if(ok) { if(!is_same(0, n-i, i)) ok = 0; } //判断A,B,C是否相等 int c = n - 3*i; if(ok) for(int j = 1; j < i; ++j) { //枚举A的长度 ok = 0; if(j == i-j && is_same(0, j, j)) continue; if(c == j && is_same(0, 2*i, j)) continue; if(c == i-j && is_same(j, 2*i, c)) continue; ok = 1; break; } if(ok) { flag = 1; break; } } } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }
如有不当之处欢迎指出!