pta 1003 我要通过
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 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
思路分析:
这道题主要是分析三个题意(我标红的地方)先看
1.突出必须仅有,也就是只有PAT三个字符且PAT只出现了一次也就是说只有一个P;
再看
2.二中的xPATx告诉我们PAT三种字符必须都要出现,其中P和T只出现了一次,
3。由
aPbTc
是正确的,那么aPbATca
也是正确的可以得出aPbTc=aPbATca=aPbAATCaa可以知道要想aPbTc成立需要满足a=c且b=A,(相当与a,b,c是字符的系数)那么我们可以假设a=AA时AAPATAA=AAPAATAAAA=AAPAAATAAAAAA,可见a保持不变,b每次加上一个A,c每次加上一个a(即a当中A的数量乘b当中A的数量=c当中A的·数量)
#include<iostream>
#include<string>
using namespace std;
bool OK(string s){
int p,t,a1,a2,a3; // pt判断是否出现,a1记入P前面A的数量,a2记入PT之间A的数量,a3记入T后面A的数量
p = t = a1 = a2 = a3 = 0;
for(char x : s){
if(x=='A'){
if(p==0 && t==0) a1++;
else if(p>0 && t==0) a2++;
else a3++;
}else if(x=='P'){
if(p!=0) return false;
p = 1;
}else if(x=='T'){
if(p==0 || t!=0) return false;
t = 1;
}else return false;
}
if(p==0||t==0) return false; // 条件1
if(a1==a3 && a2>=1) return true; // 条件2
if(a1*a2==a3 && a2 && a1 && a3) return true; // 条件3
return false;
};
int main()
{
string s;
int n;
cin >> n;
while (n--){
cin >> s;
if(OK(s)) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}