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

PAT乙1003

时间:2016-07-09 00:32:04      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

这次终于觉得智商不够用了,特么的。

总结给你的经验,对于这样字符串的题目,经常会出现一种叫做递归定义的东西。

还有一种叫做,相同的字母表示相同的字符串。

 

这道题目一共有三个条件。

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

其中,最重要的是第三个定义。

1、第一次读这条定义,那么需要满足第二条定义,那么b只可能是A,a和c必定相等,所以你能得到只有一种XPAATXX正确的错觉。

2、但是重点来了,XPAATXX的形式正确了,那么它又可以代入第三个条件了。

3、也就是说中间再加一个A,变成XPAAATXXX,这样的形式也就正确了。

 

这就是传说的递归定义。

其实树本身也是一种递归的定义。这里就不多说了。其实和这个的思想是一样的。

这道题目坑就坑在这里了。所以对于字符串的题目一定要小心这一点,很容易栽。

 

下面的代码仅仅是为了凑字数哦,写的超级烂,因为题目的意思经过一波三折,所以改动的太多,最后就成这副面目全非的样子了,好同学看到这里就可以了。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string.h>

using namespace std;

int main()
{
    char ch[105];
    int n,i,flag;//flag:0最前面,1P之后,2A之后,3T之后
    int aN = 0;//中间A的个数
    int aNU = 0;//前面A的个数
    int aNUM = 0;//后面A的个数
    int len;
    scanf("%d\n",&n);
    while (n--)
    {
        flag=0;
        aN =0;
        aNU=0;
        aNUM=0;
        gets(ch);
        len = strlen(ch);
        for (i = 0; i < len; i++)
        {
            if(flag == 0 && ch[i] == P)
            {
                flag = 1;
                continue;
            }
            else if(flag == 0 && ch[i] == A)
            {
                aNU++;
                continue;
            }
            else if(flag == 1 && ch[i] == A)
            {
                aN++;
                flag = 2;
                continue;
            }
            else if(flag == 1 && ch[i] != A)
            {
                break;
            }
            else if(flag == 2 && ch[i] == T)
            {
                flag = 3;
                continue;
            }
            else if(flag == 2 && ch[i] == A)
            {
                aN++;
                continue;
            }
            else if(flag == 3 && ch[i] != A)
            {
                flag = 0;
                break;
            }
            else if(flag == 3 && ch[i] == A)
            {
                aNUM++;
                continue;
            }
            break;
        }
        if(flag == 3 && aN == 1 && aNU != aNUM)
            cout<<"NO"<<endl;
        else if(flag == 3 && aN == 1 && aNU == aNUM)
            cout<<"YES"<<endl;
        else if(flag == 3 && aN*aNU == aNUM)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;  
}

PAT乙1003

标签:

原文地址:http://www.cnblogs.com/linkstar/p/5654848.html

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