首页 > 其他 > 详细

1003 我要通过! (20 分)

时间:2018-12-24 11:58:54      阅读:156      评论:0      收藏:0      [点我收藏+]

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

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

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO

输入样例:

8
PAT
PAAT
AAPATAA


AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO


刚开始一看这个题目看不懂。顺着题目给出的条件后慢慢看懂了。
条件1:字符串中必须仅有P、 AT这三种字符,不可以包含其它字符;
条件2:任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
这个条件的意思是可以获得“答案正确”的字符串有 PAT(x为空字符串)……APATA……
条件3:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 A 组成的字符串。
通过条件三我们来分析str1→str2
1、当a、b、c均为空字符串时,str1=PT,根据条件1、2不能证明PT是正确的字符串
2、当a、b、c均不为空字符串时,结合条件2知str1中lena=lenc,推出新的字符串中lenb=lenb+1,lenc=lenc+lena=2*lena
一次往后推可以发现,可以获得“答案正确”的字符串的特点是:lena*lenb=lenc。依照这个条件即可编写代码
 
#include <bits/stdc++.h>
using namespace std;

//任意形如xPATx的字符串都是正确的,x或者为空字符串,或者是仅有A组成的字符串 
//如果aPbTc是正确的,那么aPbATca也是正确的
vector<string> ans; 
int main()
{
    int n;
    int Ppos,Tpos;
    cin>>n;
    bool flag=true;
    string str;
    cin.ignore();
    for(int i=0;i<n;i++)
    {
        getline(cin,str);
        if(str.length()<4)
        {
            if(str=="PAT")
                ans.push_back("YES");
            else
                ans.push_back("NO");
        }
        else
        {
            for(int j=0;j<str.length();j++)
            {
                if(str[j]==P)
                    Ppos=j;
                else if(str[j]==T)
                    Tpos=j;
                else if(str[j]!=P&&str[j]!=A&&str[j]!=T)
                {
                    ans.push_back("NO");
                    flag=false;
                    break;
                }
            }
            if(flag)    //说明没有非法字符
            {
                int lena=Ppos;
                int lenb=Tpos-Ppos-1;
                int lenc=str.length()-Tpos-1;
                if(lena*lenb==lenc)
                    ans.push_back("YES");
                else 
                    ans.push_back("NO");
            } 
            flag=true;            
        }
    } 
    for(int i=0;i<ans.size();i++)
        cout<<ans[i]<<endl;
    return 0;
}



 

 







1003 我要通过! (20 分)

原文:https://www.cnblogs.com/ManOK/p/10167700.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!