*PTA(Basic Level) 1003
阿新 • • 發佈:2020-07-21
1003 我要通過! (20分)
YES
YES
YES
NO
NO
NO
NO
“答案正確”是自動判題系統給出的最令人歡喜的回覆。
本題屬於 PAT 的“答案正確”大派送
—— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
- 字串中必須僅有
P
、A
、T
這三種字元,不可以包含其它字元; - 任意形如
xPATx
的字串都可以獲得“答案正確”,其中x
或者是空字串,或者是僅由字母A
組成的字串; - 如果
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
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