码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 3818 Pretty Poem (2014年牡丹江赛区网络赛J题)

时间:2015-08-17 15:32:54      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:字符串   简单模拟   

1.题目描述:点击打开链接

2.解题思路:本题是一道模拟题,输入一个串,要求判断是否形如“ABABA”或“ABABCAB”。只需要对两种情况逐一尝试即可。然而这道题有诸多细节需要考虑。这里说一下我自己的方法。


首先,如果输入的串长度<5,那么直接输出No,或者去掉所有的标点后发现长度<5,输出No。长度上没问题后,写一个专门的solve(int type)函数,来判断是否是上述情况中的一种。对于第一种,只需要枚举A的长度即可,B的长度就是(len-3*i)/2.。接下来就是对都是A串的位置逐一判断是否相等,若相同,再判断B串的位置。最后还要判断A,B串是否相等。这里我犯了一个很经典的逻辑错。如果A,B串相等,应该是continue,我一开始写成了return false。对于类型2,和类型1的判断步骤类似。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<functional>
using namespace std;

#define me(s) memset(s,0,sizeof(s))
#define pb push_back
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair <int, int> P;


const int N = 50 + 10;
char s[N];
char t[N];

bool same(int st1,int st2,int len)//判断从st1开始和st2开始,长度均为len的两个子串是否相等
{
	int p = 0, equal = 1;
	while (p < len)
	{
		if (t[st1+p] != t[st2+ p])
		{
			equal = 0; break;
		}
		p++;
	}
	if (equal)return true;
	return false;
}

bool solve(int type)
{
	int len = strlen(t);
	if (!type)
	{
		for (int i = 1; i < len - 2 * i ; i++)
		{
			if ((len - 3 * i) % 2)continue; //len-3*i一定是偶数
			int j = (len - 3 * i) / 2;
			int p = 0, ok = 1;
			while (p<i)
			{
				if (t[p] != t[i + j + p] || (t[p] != t[2 * i + 2 * j + p]))
				{
					ok = 0; break;
				}
				p++;
			}
			if (ok)
			{
				p = 0;
				while (p<j)
				{
					if (t[p + i] != t[2 * i + j + p])
					{
						ok = 0; break;
					}
					p++;
				}
				if (ok)
				{
					if (i == j&&same(0, i, i))continue;  //注意:不要写成了return false,否则就WARush了
					return true;
				}
			}
		}
		return false;
	}
	else
	{
		for (int i = 1; i <= len - 1 - 2 * i - 3; i++)
		for (int j = 1; j <= len - 1 - 3 * i - 2 * j; j++)
		{
			int k = len - 3 * (i + j);
			if (k < 1)continue;
			int p = 0, ok = 1;
			while (p<i)
			{
				if (t[p] != t[p + i + j] || (t[p] != t[2 * i + 2 * j + k + p]))
				{
					ok = 0; break;
				}
				p++;
			}
			if (ok)
			{
				p = 0;
				while (p<j)
				{
					if (t[i + p] != t[2 * i + j + p] || (t[i + p] != t[3 * i + 2 * j + k + p]))
					{
						ok = 0; break;
					}
					p++;
				}
				if (ok)
				{
					if (i == j&&same(0, i, i))continue;
					else if (i == k&&same(0, 2 * i + 2 * j, i))continue;
					else if (j == k&&same(i, 2 * i + 2 * j, j))continue;
					return true;
				}
			}
		}
		return  false;
	}
}

int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		scanf("%s", s);
		int len = strlen(s);
		if (len<5)
		{
			puts("No"); continue;
		}
		else
		{
			int kk = 0;
			memset(t, 0, sizeof(t));
			for (int i = 0; i<len; i++)
			if (isalpha(s[i]))
				t[kk++] = s[i];
			if (kk<5)
			{
				puts("No"); continue;
			}
			else
			{
				if (solve(0) || solve(1))
					puts("Yes");
				else puts("No");
			}
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

ZOJ 3818 Pretty Poem (2014年牡丹江赛区网络赛J题)

标签:字符串   简单模拟   

原文地址:http://blog.csdn.net/u014800748/article/details/47725143

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!