ZOJ

来源:互联网 发布:添加网络歌曲到空间 编辑:程序博客网 时间:2024/05/01 02:31

          思路:对于“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;//ABABAif(n >= 5) for(int i = 2; i <= n/2; ++i) { //枚举ABif(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;}}//ABABCABif(!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;}

如有不当之处欢迎指出!

0 0
原创粉丝点击