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
题目分析:
条件一:字符串只P、A、T这三种字母
条件二:形如xPATx正确,x可为空字符串,也可为仅含A的任意字符串,两个x字符串可不一样
条件三:只有由条件二推出的正确答案x1PATx2,即使(a=x1,b=A,c=x2)条件成立才满足aPbTc为正确答案,此时条件三才成立,则aPbATca(即x1PAATx2x1)为正确答案。条件三可继续推导当
x1PAATx2x1为正确答案时,即(a=x1,b=AA,c=x2x1)成立时,则aPbATca(即x1PAAATx2x1x1)为正确答案......
#include<stdio.h> #include<malloc.h> #include<string.h> int judge(char a[]); int main() { int n,i; scanf("%d",&n); char **a=(char **)malloc(sizeof(char*)*n); int *b=(int*)malloc(sizeof(int)*n); for(i=0;i<n;i++) { b[i]=0; a[i]=(char*)malloc(sizeof(char)*100); b[i]=0; scanf("%s",a[i]); b[i]=judge(a[i]); } for(i=0;i<n;i++) { if(b[i]==1) printf("YES\n"); else printf("NO\n"); } return 0; } int judge(char a[]) { int i,len=strlen(a),p=0,t=0,left,right,middle,temp; left=0;//P左边A的个数 middle=0;//P和T间A的个数 right=0;//T右边A的个数 for(i=0;i<len;i++) { if(a[i]!='A'&&a[i]!='P'&&a[i]!='T'||a[i]=='P'&&p==1||a[i]=='T'&&t==1||a[i]=='T'&&t==0&&p==0)//字符串中出现其他字符、P或T出现多次、T在P前出现 return 0; else if(p==0&&a[i]=='P') //P出现 p=1; else if(a[i]=='T'&&t==0&&p==1)//T出现 t=1; else if(p==1&&a[i]=='A'&&t==0)//记录条件三几步推导 middle++; else if(p==0&&t==0&&a[i]=='A') left++; else if(p==1&&t==1&&a[i]=='A') right++; } temp=right-middle*left; if(p==0||t==0||middle==0)//P或T未出现,P、T间无A return 0; else if(middle>1&&temp>=0||middle==1) return 1; }