“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES
,否则输出 NO
。
输入样例:
10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APATTAA
结尾无空行
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
结尾无空行
分析题目:
根据要求一可以知道一定要含有PAT三个字母
根据要求二得出P和T只能出现一次,然后中间和左右都只能是A
根据要求三得出(P前的A的数量*中间的A的数量=T后出现A的数量)
具体代码如下:
#include <iostream>
#include <queue>
#include <string>
using namespace std;
bool judge(string x);//用于判断正误的函数
int main(){
int n;//记录总共要输入的个数
cin>>n;
queue<bool> query;//记录结果
while(n!=0){
n--;
string q;//用于存储每一个字符串
cin>>q;
query.push(judge(q));//得出的结果进入队列
}
while(!query.empty()){//队列不为空就进行判断输出结果
bool f = query.front();
query.pop();
if(query.size()==0){//最后一个没有回车,此处判断是否最后一个
if(f){
cout<<"YES";
}
else{
cout<<"NO";
}
}else{
if(f){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
}
}
bool judge(string x){//用于判断正误
bool showP =false;//判断P是否出现,T、A同理
bool showT =false;
bool showA =false;
bool flag = true;//记录整个字符串的正误
int f=0,s=0,l=0;//记录每个位置的A的数量,f(first),s(second),l(last)
for(char ch:x){//对字符串每一个字符进行检查
if(ch=='P'){//分为三种情况,进入的是PTA,如果是其他的就直接把flag置为false
if(showP){//P出现过,违反要求二,flag置为false,退出循环
flag=false;
break;
}
showP=true;//P第一次出现
continue;//进入下一个字符循环
}
else if(ch=='A'){
if(showT){//此处注意应该先判断T是否出现,如果先判断P最后的A会加在s上
l++;
}
//判断P是否出现,出现则说明是中间的A,此A出现将showA变为true,表示中间的A出现
else if(showP){
showA=true;
s++;
}
else{//都没出现就是最开始的A
f++;
}
continue;
}
else if(ch=='T'&&showA){//T必须在中间的A出现后才是正确的。
if(showT){//T出现过,违反要求二,退出循环
flag=false;
break;
}
showT = true;
continue;
}
else{
flag=false;
break;
}
}
if(flag){//此处用于判断要求三
if(f*s==l){
if(showA&&showP&&showT){//三的基础上判断条件一
flag=true;
}else{
flag=false;
}
}
else{
flag=false;
}
}
return flag;
}