1003. 我要通过!(20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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.字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
这里要注意空字符串不是空格!!!即正确形式为PAT、APATA、AAPATAA等。P之前的A个数与T之后的A个数相等。
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
这个要求是相对而言比较有难度的,需要仔细分析,一开始拿到可能完全不理解题意。aPbATca正确的前提是aPbTc正确,那么如何保证aPbTc正确呢?
根据之前的条件可知,能判断正确的必然只有条件二。即第一次递推时,aPbTc满足条件二,b==‘A‘,a==c;
递推关系:
以此类推我们可以总结出一个关系,T后面A的个数等于P前A的个数乘以P和T之间的A的个数。
这道题不难但是条件三挺绕的emmm,我是用字符串写的调用的str.length(),网上大部分都是直接用的int去数的,本质是差不多的~
起初是看到三个功能所以写了三个函数,后来发现函数一是不必要的就注释掉了~
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 bool fun1(string m); 5 bool fun2(string m); 6 bool fun3(string m); 7 int main() 8 { 9 int num; 10 cin >> num; 11 string a[10]; 12 for (int i = 0; i < num; i++) 13 cin >> a[i]; 14 for (int i = 0; i < num; i++) 15 { 16 //bool first = fun1(a[i]); 17 bool second = fun2(a[i]); 18 bool third = fun3(a[i]); 19 if ((/*first&&*/second) || (/*first&&*/third)) 20 cout << "YES" << endl; 21 else 22 cout << "NO" << endl; 23 } 24 } 25 bool fun1(string m) 26 { 27 int n = m.length(); 28 for (int j = 0; j < n; j++) 29 { 30 if (m[j] != ‘P‘ && m[j] != ‘A‘ && m[j] != ‘T‘) 31 return false; 32 } 33 return true; 34 } 35 bool fun2(string m) 36 { 37 int j = 0; 38 string str1, str2, str3; 39 for (; m[j] == ‘A‘; j++) 40 { 41 str1 += m[j]; 42 } 43 if (m[j] != ‘P‘ || m[j + 1] != ‘A‘ || m[j + 2] != ‘T‘) 44 return false; 45 j += 3; 46 for (; m[j] == ‘A‘; j++) 47 { 48 str2 += m[j]; 49 } 50 if (j != m.length()) 51 return false; 52 if (str1 != str2) 53 return false; 54 return true; 55 } 56 bool fun3(string m) 57 { 58 int j = 0; 59 string str1, str2, str3; 60 for (; m[j] == ‘A‘; j++) 61 { 62 str1 += m[j]; 63 } 64 if (m[j] != ‘P‘) 65 return false; 66 j += 1; 67 for (; m[j] == ‘A‘; j++) 68 { 69 str2 += m[j]; 70 } 71 if (str2 == "") 72 return false; 73 if (m[j] != ‘T‘) 74 return false; 75 j += 1; 76 for (; m[j] == ‘A‘; j++) 77 { 78 str3 += m[j]; 79 } 80 if (j != m.length()) 81 return false; 82 if (str3.length()!=(str1.length()*str2.length())) 83 return false; 84 return true; 85 }