1003 我要通过!(20)(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
解析
做这题的时候,我怀疑我的语文是不是体育老师教的(#`-_ゝ-)。
这题要根据给的三个条件推测出能YES的字符串。
条件一: 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
这不用说,
条件二: 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
这也不用说
条件三:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
aPbTc怎样才能是正确的呢?(我们现在只有2个条件)。那就是a和c中的A个数一样,b只能是A.由此,我们推出:
如果 aPATa 是正确的,那么 aPAATaa 也是正确的,其中 a或者是空字符串,或者是仅由字母 A 组成的字符串.
那么,照着这个条件递推,我们就能得到条件三要告诉我们的关系式了。
即: 后缀a字符串的个数 = 前缀a字符串的个数 * PAT中A的个数
warning:
a可能是空字符串,所以PAT能过,PAAT也能过,PAAAT也行。,,,,,,
在代码里,我专门写了一个函数用来判断是否为正确字符串,如果是,返回1,否则返回0.
int judgt(char *string)
{
int i=1;
int length = strlen(string);
if(string[0] == 'P'){ //this case is PAT
while(i != (length-1)){ //if begin is
if(string[i++] !='A') //then this string must
return 0; // p(n A)T
}
if(i ==1 || string[i] != 'T')
return 0;
else
return 1;
}
else if(string[0] == 'A'){ //this case is aP..A..Tcaaa
int prefix =1;
int infix=0;
int suffix = 0;
while(string[i] =='A'){ //process a,get prefix A
prefix++;
i++;
}
if(string[i++] !='P') //P
return 0;
while(string[i] =='A'){ //process b,get infix A
infix++;
i++;
}
if(infix == 0)
return 0;
if(string[i++] !='T')
return 0;
suffix = prefix * infix;
int j=0;
while(string[i] =='A'){
j++;
i++;
}
if(j !=suffix)
return 0;
else
return 1;
}
else
return 0;
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int judgt(char *string)
{
int i=1;
int length = strlen(string);
if(string[0] == 'P'){ //this case is PAT
while(i != (length-1)){ //if begin is
if(string[i++] !='A') //then this string must
return 0; // p(n A)T
}
if(i ==1 || string[i] != 'T')
return 0;
else
return 1;
}
else if(string[0] == 'A'){ //this case is aP..A..T case
int prefix =1;
int infix=0;
int suffix = 0;
while(string[i] =='A'){ //process a,get prefix A
prefix++;
i++;
}
if(string[i++] !='P') //P
return 0;
while(string[i] =='A'){ //process b,get infix A
infix++;
i++;
}
if(infix == 0)
return 0;
if(string[i++] !='T')
return 0;
suffix = prefix * infix;
int j=0;
while(string[i] =='A'){
j++;
i++;
}
if(j !=suffix)
return 0;
else
return 1;
}
else
return 0;
}
int main()
{
int string_number=0;
scanf("%d",&string_number);
int i=0;
char** string = malloc(string_number*sizeof(char *));
for(i=0;i<string_number;i++)
*(string+i) = malloc(100*sizeof(char));
i=0;
while(i !=string_number){
scanf("%s",*(string+i));
i++;
}
i=0;
int result =0;
while(i !=string_number){
result = judgt(*(string+i));
if(result == 1)
printf("YES\n");
else
printf("NO\n");
i++;
}
return 0;
}