1003 我要通过! (20 分)

微信公众号:CodeFun

思路

首先做题前理解一下题目的大致意思。

分析一下:

  1. 条件一的意思是说,在这个字符串里面有且仅有三个字符,即P,A,T
  2. 条件二的意思是说,在由P,A,T这三个字符组成的字符串里面,只有xPATx才算正确,中间只有一个A,x要么是空字符串,要么是仅由A构成的字符串。
  3. 条件三,才是本题的关键,开头写了如果aPbTc 是正确的(1),注意用到了如果,它算对,后面aPbATca(2)才是对的。那(1)怎么才算对?要用到第2个条件。

要让(1)对,b只有为A,a,c为空字符串或由A构成的字符串组成才算对。
如PAT,APATA, AAPATAA…

好了,在上述(1)如果对了的话,(2)就对了。

如:
a=空,b=A,c=空
PAT-------PAAT-----PAAAT-----PAAAAT--------等都是对的

因为仔细理解条件3,它其实就是个递推关系,aPbTc成立了,aPbaTca也就成立,那之后,aPbaTca里的ba又 可以看成新的ba,ca又可以看成新的c,就可以不断的调用条件3。

同样

APATA-----APAATAA-------APAAATAAA--------

AAPATAA------AAPAATAAAA------AAPAATAAATAAAAAA-------

当理解完题目意思之后,可以发现一个规律。字符串里面P和T只会出现1次,a,b,c,x为空的时候A的个数为0,

counta为P前面的A的个数,countb为PT中间的A的个数,countc为T后面的A的个数

拿PAT来看,counta=0,countb=1,countc=0

拿APATA来看,counta=1,countb=1,countc=1

拿APAATAA来看,counta=1,countb=2,countc=2

拿AAPAATAAATAAAAAA来看,counta=2,countb=3,countc=6

发现一个规律counta✖️countb=countc

所以当counta✖️countb=countc且满足3个条件的时候,就算对了。

code

#include 
using namespace std;
int main(){
    int n;
    string s;
    cin>>n;
    while(n--){
        cin>>s;
        int counta=0,countb=0,countc=0;
        int i=0;
        while(s[i]!='P'){
            if(s[i]=='A') counta++;
            else{//A里面可能会有T
                counta=-1;//绝对不会取到的值
                break;
            }
            i++;
        }
        i++;
        while(s[i]!='T'){
            if(s[i]=='A') countb++;
            else{
                countb=0;
                break;
            }
            i++;
        }
        i++;
        while(i<s.length()){
            if(s[i]=='A')
                countc++;
            else{
                countb=0;
                break;
            }
            i++;
        }
        if(countb==0||counta*countb!=countc) cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}

你可能感兴趣的:(PTA乙级)