PAT-1003

1003. 我要通过!(20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
 

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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

  作为一道练手题,本体着实符合ACM的题的惯例——“简单题的题目还是带有引申含义的”。刚开始看题基本只能看懂两个条件,可能是翻译的原因所以题目的意思可以说是有点用翻译应用翻译翻译的意思。我简单的把我解本体的思路列举如下:

  首先第三个条件上来有个“如果”,这个明显是告诉有前提的,排除第一个条件后我们可以基本确定是通过第二个条件来推定,好了我们根据正则表达式的特点,知道基本是#PAT#的模型,所以就有PAT三个字母,因为题目要求每个测试输入包含1个测试用例,所以我们假设就是PAT作为正确的表达式,有第三个条件”aPbTc “正确,所以ac都是null,bA,同时”aPbATca”也是正确的,所以我们肯定”PAAT”也是正确的,我们把其再看成”aPbTc”型,就有”PAAAT”也是正确的;再来我们假定”APATA”正确,所以根据”aPbTc “,可以推的”APAATAA”正确,继续还有”APAAATAAA”等正确;可以看出 PA的个数乘 P T中间的A的个数 等于TA的个数(可能先看出是倍数关系),好了本题基本AC了。

 1 /*
 2 https://www.patest.cn/contests/pat-b-practise/1003
 3 author:LY  2016.06.25
 4 */
 5 #include<iostream>
 6 #include<string>
 7 using namespace std;
 8 
 9 bool judge(string s)
10 {
11     //先判断字符串是否只含有P A T
12     for(int i=0;i<s.size();i++)
13         if(s[i]!='P'&&s[i]!='A'&&s[i]!='T')
14         { 
15             return false; 
16     }
17     //根据题意可知 P前A的个数乘 P T中间的A的个数 等于T后A的个数
18     int k1=0,flag1=0;   // P前A的个数
19     int k2=0,flag2=0;   //P T中间的A的个数
20     int k3=0;   //T后A的个数
21     
22     int kp=0;   //P的个数
23     int kt=0;   //T的个数 
24     for(int i=0;i<s.size();i++)
25     {
26         if(s[i]!='P'&&flag1==0&&flag2==0)
27         { 
28             if(s[i]=='A') 
29             k1++; 
30         }
31         if(s[i] =='P') {flag1=1;kp++;}
32         
33         if(s[i]!='T'&&flag2==0&&flag1==1)
34         { 
35             if(s[i]=='A') 
36             k2++; 
37         }
38         if(s[i]=='T') {flag2=1;kt++;}
39         
40         if(flag2==1&&flag1==1)
41         {
42             if(s[i]=='A') 
43             k3++; 
44         } 
45     } 
46     
47     //P T的个数为1 且A的个数大于1 
48     if(kp!=1||kt!=1||k1+k2+k3==0)
49         return false; 
50     if (k2!=0&&k1*k2==k3)
51         return true;
52     else 
53         return false; 
54 } 
55 int main()
56 {
57     int n;  //样例数
58     scanf("%d",&n); 
59     string s[10]; 
60     for(int i=0;i<n;i++)
61     {
62         cin>>s[i]; 
63     } 
64     
65     for(int i=0;i<n;i++)
66     {
67         if(judge(s[i]))
68           printf("YES\n");
69          
70          else
71            printf("NO\n") ;
72     } 
73     
74     return 0;
75 } 

 

 

  日进一小步,月过一大步~~加油!!!

 

posted @ 2016-05-25 20:51  代码小逸  阅读(1041)  评论(0编辑  收藏  举报