“
答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“
答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“
答案正确”,否则输出“
答案错误”。
现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“
答案正确”的。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式:每个测试输入包含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.根据第二条xPATx,其中x是任意数目的A,可知: PAT......正确 APATA......正确 AAAPATAAA......正确 ...... 2.根据第三条,如果 aPbTc 是正确的,那么 aPbATca 也是正确的,可知: PAT正确,则......PAAT正确......PAAAT正确, APATA正确,则......APAATAA正确......APAAATAAA正确, AAAPATAAA正确,则AAAPAATAAAAAA正确。 可以这样判定,设置三个变量left,mid,right分别记录P左边,PT之间和T右边A的个数。然后在可递减的情况下,令right减去left的长度,mid长度减1.直到 right<=left为止,若此时满足条件2,则判定正确。注意left和right为空的情况下,PAAT是正确的。 3.分别给P,A,T和其他字母各设置一个计数器,遍历字符串统计个数,若有其他字母出现或字母A个数为零,则输出NO。 4.字符串的处理使用string.substr()以及string.find()进行截取,定位。 参考学习:点击打开链接 参考代码:
#include<cstdio> #include<iostream> #include<string> using namespace std; int main() { int n; string s; scanf("%d",&n); for(int i=0;i<n;i++) { cin>>s; int flagP=0,flagA=0,flagT=0,other=0; for(int j=0;j<s.size();j++) { if(s[j]=='P') flagP++; else if(s[j]=='A') flagA++; else if(s[j]=='T') flagT++; else other++; } if(other||flagP!=1||flagT!=1||flagA==0) { printf("NO\n"); continue; } string left="",mid="",right=""; left=s.substr(0,s.find('P')); mid=s.substr(s.find('P')+1,s.find('T')-s.find('P')-1); right=s.substr(s.find('T')+1); while(right.size()>left.size()&&mid.size()>=1){ right=right.substr(0,right.size()-left.size()); mid=mid.substr(0,mid.size()-1); } if(left==right&&mid.size()==1) printf("YES\n"); else if(left.size()==0&&right.size()==0&&mid.size()>0)printf("YES\n"); else printf("NO\n"); } return 0; }