1.題目 :
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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
YES
NO
NO
NO
NO
2.分析
看到這題以後我是真的不知道題目說的是什麼意思.後來網上各種找尋大神的答案纔算弄明白,要顯示"通過"必須滿足三個條件
- 輸入的字符中只能含有P A T三個字符,出現其它字符即爲"不通過"
- 形如xPATx這種形式也是正確的,但是x只能是A或者空
- 條件3是最難理解的, 分析一下由aPbTc正確(其中a b c由若干個A組成的字符串) ==>> aPbATac 正確,不難發現,當b每多一個A,那麼右邊也就多出一個a.例如
aPATc 、 aPAATca 、 aPAAATcaa 由此不難發現 T右邊A的數量是 P左邊A數量的整數倍即a x b = c
由此三個條件的分析可以寫出如下代碼
3.代碼
#include <iostream>
#include <string>
using namespace std;
bool isPAT(string str) {
int P_i = 0, T_i = 0; //P_i和T_i分別記錄 P和T 在字符串中的位置
int count_P = 0, count_T = 0; //記錄P和T的數量
for (int i = 0; i < str.length(); i++) {
if (str[i] != 'P' && str[i] != 'A' && str[i] != 'T') { //如果不滿足條件1,直接返回false
return false;
}
if (str[i] == 'P') {
P_i = i;
count_P++;
}
if (str[i] == 'T') {
T_i = i;
count_T++;
break;
}
}
//第一個判斷條件是滿足條件3 第二個判斷條件保證PT之間一定要有A
if (P_i * (T_i - 1 - T_i) == (str.length() - T_i - 1) && T_i - P_i - 1 > 0 && count_P == 1 && count_T == 1 ) {
return true;
}
else {
return false;
}
}
int main() {
int n;
string str;
cin >> n;
while (n--) {
cin >> str;
if (isPAT(str)) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
}