PAT乙级 1003 我要通过! (20分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P、A、T这三种字符,不可以包含其它字符; - 任意形如
xPATx的字符串都可以获得“答案正确”,其中x或者是空字符串,或者是仅由字母A组成的字符串; - 如果
aPbTc是正确的,那么aPbATca也是正确的,其中a、b、c均或者是空字符串,或者是仅由字母A组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (n<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,
且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES YES YES YES NO NO NO NO
思路:
本题只允许输入三个字符'P','A','T',
因此可以直接设置一个哈希表记录这三个字符出现的次数,由于题目限定输入字符范围,因此这个哈希表长度不会很长,
然后根据哈希表键值特征来进行判断,具体代码如下:
1 #include <iostream> 2 using namespace std; 3 4 bool judge(string s) 5 { 6 int a[5] = {0}; 7 for(int i = 0; i < s.length(); i++) { 8 if(s[i] != 'P' && s[i] != 'A' && s[i] != 'T') { 9 return false; 10 } 11 if(s[i] == 'P') { 12 a[0]++; 13 if(a[1] != 0 || a[0] > 1) { 14 return false; 15 } 16 } else if(s[i] == 'T') { 17 a[1]++; 18 if(a[0] == 0 || a[1] > 1) { 19 return false; 20 } 21 } else { 22 if(a[0] == 0 && a[1] == 0) { 23 a[2]++; 24 } else if(a[0] != 0 && a[1] == 0) { 25 a[3]++; 26 } else { 27 a[4]++; 28 } 29 } 30 } 31 32 if(a[0] == 0 || a[1] == 0 || a[3] == 0) { 33 return false; 34 } else if(a[3] * a[2] != a[4]) { 35 return false; 36 } else { 37 return true; 38 } 39 40 } 41 42 int main() 43 { 44 int n; 45 cin >> n; 46 for(int i = 0; i < n; i++) { 47 string s; 48 cin >> s; 49 if(judge(s)) { 50 cout << "YES" << endl; 51 } else { 52 cout << "NO" << endl; 53 } 54 } 55 return 0; 56 }

浙公网安备 33010602011771号