/******************************
我要通过!
题目:
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入
的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。得到“答案正确”的条件是:
1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。
接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
程序调试举例:
输入样例:
9
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
分析:
1.根据条件一可以确定通过测试的字符串里面不可以有除“A P T”之外的字符。
2.根据条件二可以知道通过的测试的最小字符串为PAT,且不可更改顺序。
3.根据条件二可以写出以下可以通过的字符:
PAT
APATA
AAPATAA
..AAAPATAAA..
4.在满足条件二的情况下,根据条件三可得基础变形规律:
* 将P左边的A复制到T的右边。(注意是复制不是剪切)。
* PT之间的A的数量+1。
PAT --------> PAAT
APATA --------> APAATAA
AAPATAA --------> AAPAATAAAA
..AAAPATAAA..-------->..AAAPAATAAAAAA..
注意:可通过的字符串经过变形形成的新字符串也是可通过的
以上经过条件三变形前字符串中的b都是只含有一个A
以上经过条件三变变形后的字符串也符合条件三
5.在满足条件二以及基础变形规律的情况下,可有以下进阶变形:
PAT ---> PAAT ---> PAAAT ---> PAAAAT
APATA ---> APAATAA ---> APAAATAAA --->APAAAATAAAA
AAPATAA ---> AAPAATAAAA ---> AAPAAATAAAAAA --->......
..AAAPATAAA..--->..AAAPAATAAAAAA.. --->.AAAPAAATAAAAAAAAA..--->......
6.根据条件二和条件三以及实例可知PT之间不能为空,至少有一个A。
7.假设P左边的A个数为L_A
PT之间的A个数为N_A
T右边的A个数为R_A
由于字符串的出发点是‘对称’的‘..PAT..’所以 L_A=R_A N_A=1 (R_A=N_A*L_A)。
条件三的变化过程为 A_L 复制到 R_A 上,所以 R_A=n*L_A n=1,2,3...
因为每变化一次 N_A的值+1 n的值+1 且N_A与n的初始值都为1,所以可以用N_A的值代替n
即可得恒等式: R_A=N_A*L_A
程序思路:
得到测试数据的数量,使其充当循环判断次数变量。
⬇
读取字符串。
⬇
从字符串首地址开始统计字符A的个数,直到遇到不是A的字符‘x’结束统计,将A个数赋值给L_A。
⬇
判断字符‘x’是否为P字符,若否输出NO后跳出本次循环,该字符串不能通过。
⬇是
继续统计字符P后的A的个数,直到遇到不是A的字符‘x’结束统计,将A个数赋值给N_A。
⬇
判断字符‘x’是否为T字符,若否输出NO后跳出本次循环,该字符串不能通过。
⬇是
继续统计字符T后的A的个数,直到遇到不是A的字符‘x’结束统计,将A个数赋值给R_A。
⬇
判断字符‘x’是否为‘\0’字符,若否输出NO后跳出本次循环,该字符串不能通过。
⬇是
判断 R_A=N_A*L_A是否成立,若否输出NO后跳出本次循环,该字符串不能通过。
⬇是
输出YES,继续下一次循环,读取下一个字符串进行判断。
注意:
程序调试举例中的‘9’不是没有意义的,测试区中仅提供9个字符串验证程序
但是提交后后台测试程序并不是这9个,甚至不止于9个。
而且题目中说:每个测试输入格式第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。
所以循环检测判断的次数,需要自己读取并调用。
*******************************/
1 #include <stdio.h>
2
3 int main()
4 {
5 int A_L,A_R,A_N,i,j; //model: A_L P A_N T A_R
6 char str[101],*p;
7 j=getchar()-48; //读取字符串个数
8 for(i=0;i<j;i++)
9 {
10 A_L=0,A_R=0,A_N=0;
11
12 scanf("%s",str);
13 p=str;
14
15 while(*p!='\0')
16 {
17 while(*p=='A')
18 {
19 A_L++;p++;
20 }
21 if(*p!='P')
22 {
23 printf("NO\n");break;
24 }
25 else {p++;}
26
27 while(*p=='A')
28 {
29 A_N++;p++;
30 }
31 if(*p=='T'&&A_N!=0) //remove ..PT.. case
32 {
33 p++;
34 }
35 else
36 {
37 printf("NO\n"); break;
38 }
39
40 while(*p=='A')
41 {
42 A_R++;p++;
43 }
44 if(*p!='\0')
45 {
46 printf("NO\n");break;
47 }
48
49 if(A_R==A_N*A_L) //has been proved N>0 && without other letter
50 {
51 printf("YES\n");
52 }
53 else
54 {
55 printf("NO\n");
56 }
57 }
58 }
59 return 0;
60 }