当前位置:   article > 正文

【PAT B1003】我要通过! (20 分)_pta b1003

pta b1003

1003 我要通过! (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

输入样例:

  1. 8
  2. PAT
  3. PAAT
  4. AAPATAA
  5. AAPAATAAAA
  6. xPATx
  7. PT
  8. Whatever
  9. APAAATAA

 ====================================================

分析:解题的关键点是 :P前面A的个数,PT之间A的个数,以及T之后A的个数,它们三者之间存在怎样的关系。

 

题目给了3个条件,我们逐条分析:

1.仅有P,A,T三种字符,不能有其他字符。

2.任意形如xPATx是对的,x 或者是空字符串,或者是仅由字母 A 组成的字符串。

这里,前后2个x是同一个字符串。设x的个数为n。

三者关系:n * 1 = n. (n >= 0)      // 哪3者?P前面A的个数,PT之间A的个数,以及T之后A的个数。

解释一下这个条件:

如果P之前A个数为0(P之后A个数也为0,因为他俩是同一个串),则PT之间可以有任意多A。 毕竟 0 * 任何数 = 0;

如果中间A为1,P之前A个数为任意的n(P之后A的个数也是n,因为他俩是同一串),也是正确的。毕竟 n * 1 = n;

3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A组成的字符串。

P之前A的个数为lenA, PT之间A的个数为lenB,T之后A的个数为lenC。在条件2中,lenA = lenC

例如:AAAPATAAA,由条件2可知是正确的。即3 * 1 = 3

在条件2的基础上(lenA = lenC),PT之间再插入一个A,则T之后A的个数为 lenA 与 lenC 连接起来的个数,为lenA + lenC = 2lenA。

即:AAA(3个A)PAA(2个A)TAAAAAA(6个A), 3 * 2 = 6也是正确的。

再来一下是,新的lenC = lenA + lenC,AAA(3个A)PAAA(3个A)TAAAAAAAAA(9个A),3 * 3 = 9也是正确的。

类推,lenA * lenB = lenC时,是正确的。

 ====================================================

  1. #include <iostream>
  2. #include <map>
  3. using namespace std;
  4. int main(){
  5. int n, p = 0, t = 0;
  6. string s;
  7. cin >> n;
  8. for(int i = 0; i < n; i++){
  9. cin >> s;
  10. map<char, int> m;
  11. for(int j = 0; j < s.size(); j++){
  12. m[s[j]]++;
  13. if(s[j] == 'P') p = j;
  14. if(s[j] == 'T') t = j;
  15. }
  16. if(m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3
  17. && t - p != 1 && p * (t - p - 1) == s.length() - t - 1)
  18. printf("YES\n");
  19. else
  20. printf("NO\n");
  21. }
  22. return 0;
  23. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/617563
推荐阅读
相关标签
  

闽ICP备14008679号