PAT乙级B1003 -我要通过!(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

思路:
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;
}



猜你喜欢

转载自blog.csdn.net/vir_lee/article/details/80200435