pat 1003. 我要通过!(20)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符; 2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串; 3. 如果 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
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int func(string str); 6 7 int main() { 8 int n; 9 cin >> n; 10 getchar(); 11 string *s = new string [n]; 12 for (int i = 0; i < n; i++) { 13 getline(cin,s[i]); 14 } 15 int *t = new int [n]; 16 for (int i = 0; i < n; i++) { 17 t[i] = 0; 18 } 19 for (int j = 0; j < n; j++) { 20 t[j] = func(s[j]); 21 } 22 23 for (int k = 0; k < n; k++) { 24 if (t[k] == 1) { 25 cout << "YES" << endl; 26 } 27 if (t[k] == 0) { 28 cout << "NO" << endl; 29 } 30 } 31 delete [] s; 32 delete [] t; 33 return 0; 34 } 35 36 int func(string str) { 37 int len = str.length(); 38 if (len <= 2) 39 return 0; 40 for (int i = 0; i < len; i++) { 41 if (str[i] != 'P' && str[i] != 'A' && str[i] != 'T') { 42 return 0; 43 } 44 if (str[i] == 'P') { 45 for (int j = 0; j < i; j++) { 46 if (str[j] != 'A') 47 return 0; 48 } 49 if (str [i + 1] != 'A') 50 return 0; 51 for (int k = i + 2; k < len; k++) { 52 if (str[k] != 'A') { 53 if (str[k] != 'T') { 54 return 0; 55 } 56 if ((len - 1 - k) != ((k - 1 - i) * i)) 57 return 0; 58 for (int m = k + 1; m < len; m++) { 59 if (str[m] != 'A') 60 return 0; 61 } 62 } 63 } 64 } 65 } 66 return 1; 67 }
越努力,越幸运