1003. 我要通过!(20)

1003. 我要通过!(20)

时间限制
400 ms
内存限制
65536 kB

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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和T,此外只含有A;且P左边的A的数量al 乘以 PT之间的A的数量am  等于 T右边的A的数量ar。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int n;
 7     string s;
 8     cin>>n;
 9     while(n--){
10         cin>>s;
11         int al,am,ar,p,t,o;
12         al=am=ar=p=t=o=0;
13         for(int i=0,len=s.length();i<len;i++){
14             switch(s[i]){
15                 case 'P':{
16                     p++;
17                     break;
18                 }
19                 case 'T':{
20                     t++;
21                     break;
22                 }
23                 case 'A':{
24                     if(!p&&!t) al++;
25                     else if(!t)    am++;
26                     else ar++;
27                     break;
28                 }
29                 default:{
30                     o++;
31                     break;
32                 }
33             }
34         }
35         puts(p==1&&t==1&&o==0&&am&&al*am==ar?"YES":"NO");
36     }
37     return 0;    
38 }
原文地址:https://www.cnblogs.com/Fresh--air/p/8576397.html