【PAT乙级 】1003. 我要通过!

题目地址:https://www.nowcoder.com/pat/2/problem/4069

题目如下

题目描述
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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 A T 三个数字。
条件2 可以得到, xPATx PAT三个字母前后都可以有相同数量的A
条件3 可以得到,是在条件2的基础上使得 aPbATca 成立。由条件2我们可以知道,首尾xPATx的x是一样的,类似aPbATc,假设此处b=1,那么式子就等于aPATc,而a=c(xPATx)。
我们继续根据条件3往下迭代。在aPbATc中,若使b=1A,那么aPbATac就相当于aPAATac。而由前面知 a=c,因此这个式子也可以写成 aPAATaa。我们再继续往下推一步。假设b=2A,那么aPAAATac,由于上一个推导式我们已知aPAATaa是正确的,这里令a=a,aa=c,则该式子就是 aPAATc,所以aPAAATac是正确的。
由以上可知,经过推导,开头的A的个数*中间A的个数就是结尾A的个数。

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    int p=0,t=0;
    string str;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>str;
        map<char,int>m;
        for(int j=0;j<str.size();j++){
            m[str[j]]++;
            if(str[j] == 'P')p = j;
            if(str[j] == 'T')t = j;
        }
        if(m['P']==1&&m['T']==1&&m['A']!=0&&m.size()==3&&p*(t-p-1)==str.length()-t-1)
            cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }

}
你好啊,谢谢你来看我。
原文地址:https://www.cnblogs.com/sitr/p/For_the_LichiKing.html