1003 我要通过! (20 分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母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
题记:
不得不承认这个题刚开始我没看懂,后来百度到一种思路:
通过的条件是:①字符串中有一个P,一个T,若干个A,没有其他字母。②P左边A的个数 × P、T之间A的个数 = T右边A的个数。
我们先验证一下上面说到的条件是不是对的:(显然①没有争议,直接看②。)
对于题中给的条件1:0 × 1 = 0。符合。
条件2:x × 1 = x。符合。
条件3:若aPbTc
是正确的,那么 a × b = c,显然 a ×(b+1)= a × b + a = c + a ,那么 aPbATca
也是正确的。符合。
验证看懂了之后也就明白②的公式怎么来的了,至于自己做题怎么想到这个思路,还是要多做题多练习……
有了思路之后,做题就很容易了,其他不多说,看代码。
参考链接:1003 我要通过!(20)(20 分)
C++代码:
#include<cstdio>
#include<iostream>
using namespace std;
int main (){
int n;
cin >> n;
getchar();
while(n--){
int flag_word = 1;//记录字符类型,若出现PAT之外的字母则变为0
int flag_position = 1;//记录字符位置,P前1,P~T之间2,T后3
int num_P=0, num_T=0, num_A=0, num_A1=0, num_A2=0, num_A3=0;
//输入并记录各个量
for (char word; word=getchar(), word!='\n'; ){
if(flag_position == 1){
if(word == 'P'){
flag_position ++;
num_P ++;
}else if(word == 'A'){
num_A ++;
num_A1 ++;
}else{
flag_word = 0;
}
}else if(flag_position == 2){
if(word == 'T'){
flag_position ++;
num_T ++;
}else if(word == 'A'){
num_A ++;
num_A2 ++;
}else{
flag_word = 0;
}
}else if(flag_position == 3){
if(word == 'A'){
num_A ++;
num_A3 ++;
}else{
flag_word = 0;
}
}
}
//判断是否符合条件并输出
if(flag_word && num_A && num_P==1 && num_T==1 && num_A1*num_A2==num_A3){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
return 0;
}