题记
这道题一开始没发现规律,虽然过了但是写了80行代码,又看了看别人的代码发现有规律可循,a、b、c当中字符’A’的个数分别表示为numa、numb、numc,那么就有numa*numb=numc,这个需要自己推一下。
我们一开始很直观地可以发现最基本的情况是xPATx,其中x可以是任意多个字符’A’组成的字符串(当然长度并不能超过题目给的范围),接着看第三条,这其实是一个递推公式,最基本的情况也就是b所包含的字符’A’的个数是一,之后每一次b中A的个数加一,而且我们知道如果b只有一个A的时候第三个条件里a和c肯定是一样的,那么往后推的aPbATca当中ca所组成的新的字符串也就多加了一个c,新的ca将会作为下一个递推公式的c,这样其实就相当于累加,c这一部分每次都会加一个a,与b的变化想类似,区别在于b每次加一个A,而c每次加一个a,于是可以得到numa * numb=numc
代码如下
#include <iostream>
#include <string>
using namespace std;
int n;
int main()
{
string str;
cin>>n;
for(int i=0;i<n;i++){
int posP=0,posT=0;
int countP=0,countT=0;
bool flag=true;
cin>>str;
for(int j=0;j<str.size();j++){
if(str[j]=='P'){
countP++;
posP=j;
}
else if(str[j]=='T'){
countT++;
posT=j;
}
else if(str[j]!='A'){
flag=false;
break;
}
}
if(!flag||countP!=1||countT!=1||posT-posP<2){
cout<<"NO"<<endl;
}
else{
int numa=0,numb=0,numc=0;//a、b、c中A的个数
numa=posP,numb=posT-posP-1,numc=str.size()-posT-1;
if(numa*numb==numc)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}