1003 我要通过! (20 分)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 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;
}



 

 







posted @ 2018-12-24 11:33  focusDing  阅读(412)  评论(0编辑  收藏  举报