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

ZOJ 3813 Pretty Poem (暴力)

时间:2015-08-08 19:57:28      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:zoj 暴力

Pretty Poem

Time Limit: 2 Seconds      Memory Limit: 65536 KB

Poetry is a form of literature that uses aesthetic and rhythmic qualities of language. There are many famous poets in the contemporary era. It is said that a few ACM-ICPC contestants can even write poetic code. Some poems has a strict rhyme scheme like "ABABA" or "ABABCAB". For example, "niconiconi" is composed of a rhyme scheme "ABABA" with A = "ni" and B = "co".

More technically, we call a poem pretty if it can be decomposed into one of the following rhyme scheme: "ABABA" or "ABABCAB". The symbol A, B and C are different continuous non-empty substrings of the poem. By the way, punctuation characters should be ignored when considering the rhyme scheme.

You are given a line of poem, please determine whether it is pretty or not.

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

There is a line of poem S (1 <= length(S) <= 50). S will only contains alphabet characters or punctuation characters.

Output

For each test case, output "Yes" if the poem is pretty, or "No" if not.

Sample Input

3
niconiconi~
pettan,pettan,tsurupettan
wafuwafu

Sample Output

Yes
Yes
No


题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3818

解题思路:字符串处理,直接暴力枚举A,B,C,直接判断是否满足两种情况。注意A,B,C各不相同,我是两种情况分类开处理,第二种 情况时把AB看成一个子串直接判断了,但还要判断AB能分解成两个不同子串子串A,B且不和C相同。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <string>
#include <algorithm>
#include <string>
using namespace std;
//const int maxn=205;
int main(void)
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		string s,a;
		cin>>s;
		int p=0,n=0;
		int len=s.length();
		for(int i=0;i<len;i++)
			if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')
			{
				a+=s[i];
				n++;
			}
		for(int l1=1;l1<=n;l1++)  //第一种情况ABABA的判断
		{
			string A=a.substr(0,l1);   //子串A总是从第一个位置开始的
			for(int l2=1;l2<=n;l2++)
			{
				if(l1+l2+l1+l2+l1>n)    //长度和大于主串,不必再往后枚举
					break;
				string B=a.substr(l1,l2);  //子串B总是紧挨着子串A
				if(a==A+B+A+B+A&&A!=B)
				{
					p=1;
					break;
				}
			}
			if(p)
				break;
		}
		if(p)
		{
			printf("Yes\n");
			continue;
		}
		for(int l1=2;l1<=n;l1++)    //第二种情况ABABCAB的判断
		{
			string AB=a.substr(0,l1);   //把AB看成一个子串
			for(int l2=1;l2<=n;l2++)
			{
				if(l1+l1+l2+l1>n)break;
				string C=a.substr(2*l1,l2);
				if(a==AB+AB+C+AB)       //满足条件时进一步判断AB能分解成不同的子串A和B
				{
					int lab=AB.length();
					for(int k=1;k<lab;k++)
					{
						string A=AB.substr(0,k);
						string B=AB.substr(k,lab-k);
						if(A!=C&&A!=B&&B!=C)
						{
							p=1;
							break;
						}
					}
					if(p)
						break;
				}
			}
			if(p)break;
		}
		if(p)
			printf("Yes\n");
		else
			printf("No\n");
	}
}


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

ZOJ 3813 Pretty Poem (暴力)

标签:zoj 暴力

原文地址:http://blog.csdn.net/criminalcode/article/details/47361111

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