1003. 我要通过!(20)

来源:互联网 发布:室内设计知乎 编辑:程序博客网 时间:2024/06/15 16:57

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

由第二个条件中的X可知第三个条件中的a和c是相等的,于是第三个条件的描述其实是当(n*A)PAT(n*A)为正确时,(n*A)P(m*A)T(n*m*A)也是正确的。

代码如下:

#include<stdio.h>void printover(int *over,int n)//打印结果{  int m;  for(m=0;m<n;m++)  {    if(over[m]==0)    printf("NO\n");    else    printf("YES\n");  }}main(){  char pat[101];  int over[10];  int n,i,re,flag,flaga,flagb,flagc,flagbb;  scanf("%d",&n);  for(i=0;i<n;i++)  {    scanf("%s",pat);      for(re=0;pat[re]=='A';re++);//re为遍历字符串的指针      flaga=re;//计算P之前A的个数记为flaga      if(pat[re]=='P')          {            re++;          flag=re;          for(;pat[re]=='A';re++);//计算P之后A的个数记为flagbb          flagbb=re-flag;          if(flag==re)//如果P之后没有A的话,结果为0,结束继续输入下个字符串          {              over[i]=0;              continue;          }          if(pat[re]=='T')          {              re++;              flagb=re;              for(;pat[re]=='A';re++);//计算T之后A的个数记为flagc              flagc=re-flagb;        //printf("a=%d\nb=%d\nc=%d\n",flaga,flagbb,flagc);              if(pat[re]=='\0'&&flagc==(flagbb*flaga))              {                  over[i]=1;              }              else              {                 over[i]=0;              }          }            else              {                over[i]=0;                continue;              }        }        else      {        over[i]=0;        continue;      } }  printover(over,n);}
0 0