“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA输出样例:
YES YES YES YES NO NO NONO
//这道题看起来有些复杂,稍微有一些不太好理解。 //简单来讲,P之前A的数量乘以P和T之间A的数量是否等于T后面A的数量。 //也就是aPbTc, a*b == c #include <iostream> #include <string> using namespace std; bool checkPAT(string w){ int a = 0, b = 0, c = 0,cntP = 0,cntA = 0,cntT = 0; bool findP = false; //检查字符串中是否包含PAT三个字母 if (w.find('P') == w.npos || w.find('A') == w.npos || w.find('T') == w.npos){ return false; } for (int i = 0; i < w.size(); ++i){ //如果字符串中含有其他字母,返回false if (w[i] != 'P' && w[i] != 'A' && w[i] != 'T'){ return false; } if (w[i] == 'A'){ cntA++; } if (w[i] == 'P'){ cntP++; findP = true; a = cntA; cntA = 0; } if (w[i] == 'T'){ //如果T在P之前出现,返回false if (!findP){ return false; } cntT++; b = cntA; cntA = 0; } } c = cntA; //如果字符串中有多个P字母或者T字母,返回false,如果PT之间不包含A,返回false //不满足上述条件,返回a * b == c if (cntP > 1 || cntT > 1){ return false; } else if (!b){ return false; }else{ return a*b == c; } } int main(){ int n; cin >> n; string word; while (n--){ cin >> word; if (checkPAT(word)){ cout << "YES" << endl; } else{ cout << "NO" << endl; } } system("pause"); return 0; }