ZOJ 3813 Pretty Poem (暴力)

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");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值