1. 程式人生 > 實用技巧 >*PTA(Basic Level) 1003

*PTA(Basic Level) 1003

1003 我要通過! (20分)

答案正確”是自動判題系統給出的最令人歡喜的回覆。

本題屬於 PAT 的“答案正確”大派送

—— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。

得到“答案正確”的條件是:

  1. 字串中必須僅有 PAT這三種字元,不可以包含其它字元;
  2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;
  3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a
    bc 均或者是空字串,或者是僅由字母 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三種字元

2、PAT;可在PAT前後加上相同數量的A

3、字串為aPbTc形式(a,b,c為空或者不同數目A組成的字串),每在P,T之間加一個A,在字串結尾加上a,變成aPbATca。

這三種條件不是獨立的。

1是基本條件,再根據條件2可以寫出PAT、APATA, AAPATAA……這樣的字串,再根據條件3得到PAA..T, APAATAA, AAPAATAAA

綜合2、3,a,b,c中A的個數滿足關係 len(a) * len(b) = len(c)。

https://blog.csdn.net/he_yang_/article/details/91798477這篇部落格裡有遞推過程。

#include<iostream>
#include<string>

using namespace std;

void solve(string s)
{
    int num_of_P=0;//記錄P的個數 
    int locate_of_T=0;  
    int num_of_T=0;
    int locate_of_T=0;
    int other=0;//記錄非法字元
    
    int l=s.length();
    for(int i=0;i<l;i++)
    {
        if(s[i]=='P'){
            num_of_P++;
            locate_of_P=i;
        }
        else if(s[i]=='T'){
            num_of_T++;
            locate_of_T=i;
        }
        else if(s[i]!='A')
            other++;
    }
    
    if(num_of_P !=1||num_of_T!=1||other||local_of_T-local_of_P<=1){
        cout<<"NO"<<endl;  // 有多個P,多個T,非法字元,以及P和T之間無A的情況
    }
    else if((local_of_P)*(local_of_T-local_of_P-1)==(input.length()-local_of_T-1) ){
        cout<<"YES"<<endl;  // 考慮了上述幾種特殊情況之後再來考慮正常情況
    }
    else{
        cout<<"NO"<<endl;  // A的數量不滿足要求的情況
    }    
}

int main(){
    int n;
    cin>>n;
    string inputStr;
    for(int i=0;i<n;i++)
    {
        cin>>inputStr;  
    }
    Solve(inputStr);
    return 0;
}

程式碼參考:https://blog.csdn.net/weixin_39059031/article/details/106040749