微信公众号:CodeFun
思路
首先做题前理解一下题目的大致意思。
分析一下:
- 条件一的意思是说,在这个字符串里面有且仅有三个字符,即P,A,T
- 条件二的意思是说,在由P,A,T这三个字符组成的字符串里面,只有xPATx才算正确,中间只有一个A,x要么是空字符串,要么是仅由A构成的字符串。
- 条件三,才是本题的关键,开头写了如果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 <bits/stdc++.h>
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;
}