ZOJ - 3818 Pretty Poem 暴力

题目大意:给出一个字符串,问这个字符串是不是"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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值