“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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
仍有两个错误点:已知测试数据 PAT出问题,但找不出代码问题
模拟题意可知 ------满足题意的字符串有 xPATx 或 xPAATxx 两种
# include<iostream>
# include<string>
# include<stdio.h>
using namespace std;
int main()
{
string x,x1,x2,s;
int n,i,j;
cin>>n;
getchar(); ///吸收回车
while(n--)
{
int flag=0,h=0;
bool k=true;
getline(cin,s); //含空格的输入
for(i=0;i<s.length();i++) //i作为一个标志 PAT与前面字符串x 的标准
{
if(s[i]==‘P‘ && s[i+1]==‘A‘ && s[i+2]==‘T‘ && (i+2)<s.length() ) ////核心条件:有PAT才有可能为真
{
flag=1; //方式一
j=i+3; //j作为一个标志 PAT与后面字符串 的标志
break;
}
if(s[i]==‘P‘ && s[i+1]==‘A‘ && s[i+2]==‘A‘ &&s[i+3]==‘T‘ && (i+3)<s.length() ) ////核心条件:有PAAT才有可能为真
{
flag=2;
j=i+4;
break;
}
}
if(i==s.length()) ///如果没有PAAT 或PAT 一定为假
{
k=false;
}
if(k==true) ////只有为真 才有必要进行以下判断操作
{
for(h=0;h<i;h++)
{
x[h] = s[h]; //把PAT前面的字符串存入x
}
for(h=j;h<s.length();h++)
{
x1[h] = s[h]; //把PAT后面的字符串存入x1
}
}
if(k==true) ////这一部分的功能是判断前面的字符串是否仅含有A或 空格
{
if(x[0]== ‘A‘)
{
for(h=1;h<i;h++)
{
if(x[h] != ‘A‘)
{
k = false;break;
}
}
if(k==true)
{
for(h=0;h<2*i;h++) ///这一部分是为了方案2准备
{
x2[h]=‘A‘;
}
}
}
else if(x[0]==‘ ‘)
{
for(h=1;h<i;h++)
{
if(x[h] != ‘ ‘)
{
k = false;break;
}
}
if(k==true)
{
for(h=0;h<2*i;h++)
{
x2[h]=‘ ‘;
}
}
}
else
{
k = false;
}
}
if(k==true)
{
if(flag==1)//如果是PAT
{
if(x != x1)
{
k = false;
}
}
if(flag==2)//如果是PAAT
{
if(x2 != x1)
{
k = false;
}
}
}
if(i==0 && j==s.length()) //如果恰好为PAT PAAT 结果也为真
{
k = true;
}
if(k==true)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
return 0;
}