zoukankan      html  css  js  c++  java
  • PAT乙1003

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

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

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

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

    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);
        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;  
    }
  • 相关阅读:
    Ping
    boost::python开发环境搭建
    mingw和libcurl
    ssh远程执行命令使用明文密码
    netty源码阅读之UnpooledByteBufAllocator
    Direct ByteBuffer学习
    clions的使用
    netty中的PlatformDependent
    STL之priority_queue(优先队列)
    c++线程调用python
  • 原文地址:https://www.cnblogs.com/linkstar/p/5654848.html
Copyright © 2011-2022 走看看