PAT-B-1003
1003 我要通过!(20 分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
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
思考:
分析题意分析,P之前A的个数PA,P与T中间A的个数PAT,T之后的A的个数TA,存在:TA = PAT*PA。有了这个结论之后问题就转变为如何求这三个值了。
1 #include <stdio.h> 2 #include <string.h> 3 4 int judge(int a, int b, int c){ 5 return c == b*a;//根据两个递归条件得到:P之前的A个数、PT中间的A个数、T之后的A个数之间的关系 6 } 7 8 int main(void) 9 { 10 int i, j, n, flag; 11 int a, b, c; 12 char str[101]; 13 scanf("%d", &n); 14 for( j=0; j<n; j++){ 15 flag=1; 16 scanf(" %s", &str); 17 int len = strlen(str); 18 if( len < 3 ){//长度验证 19 printf("NO"); 20 if( j < n-1 ) printf("\n"); 21 continue; 22 } 23 else{ 24 //找到P前只能有A或空 25 for( i=0; i<len; i++ ){ 26 if( str[i] == 'P' ) 27 break; 28 if( str[i] != 'A' ){ 29 printf("NO"); 30 if( j < n-1 ) printf("\n"); 31 flag = 0; 32 break; 33 } 34 } 35 if( flag == 0 ) continue; 36 a = i - 0;//P之前A的个数 37 38 if( len - i == 3 ){//仅剩3字符 39 if( str[i] == 'P' && str[i+1] == 'A' && str[i+2] == 'T' ){ 40 printf("YES"); 41 if( j < n-1 ) printf("\n"); 42 flag = 1; 43 } 44 else{ 45 printf("NO"); 46 if( j < n-1 ) printf("\n"); 47 flag = 0; 48 } 49 continue; 50 } 51 else if( len - i < 3){ 52 printf("NO"); 53 if( j < n-1 ) printf("\n"); 54 flag = 0; 55 continue; 56 } 57 else{ 58 int count=0; 59 for( i=i+1; i<len; i++ ){ 60 if( str[i] == 'T' ) 61 break; 62 else if( str[i] != 'A' ){//P与A之间有其他字符 63 printf("NO"); 64 if( j < n-1 ) printf("\n"); 65 flag = 0; 66 } 67 } 68 if( flag == 0 ) continue; 69 b = i - a - 1;//P、T之间的A的个数 70 c = len - i - 1;//T之后A的个数 71 72 //检查T之后还有没有除A以外的字符 73 for( i=i+1; i<len; i++){ 74 if( str[i] != 'A' ){ 75 printf("NO"); 76 if( j < n-1 ) printf("\n"); 77 flag=0; 78 break; 79 } 80 } 81 } 82 } 83 if( flag == 1 ) { 84 flag = judge(a, b, c); 85 if( flag ) printf("YES"); 86 else printf("NO"); 87 } 88 89 if( j < n-1 ) printf("\n"); 90 } 91 92 return 0; 93 }