“答案正確”是自動(dòng)判題系統(tǒng)給出的最令人歡喜的回復(fù)算利。本題屬于PAT的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件宴胧,系統(tǒng)就輸出“答案正確”稀颁,否則輸出“答案錯(cuò)誤”肢藐。
得到“答案正確”的條件是:
1.字符串中必須僅有P, A, T這三種字符,不可以包含其它字符捏境;
2.任意形如 xPATx 的字符串都可以獲得“答案正確”于游,其中 x 或者是空字符串毁葱,或者是僅由字母 A 組成的字符串垫言;
3.如果 aPbTc 是正確的,那么 aPbATca 也是正確的倾剿,其中 a, b, c 均或者是空字符串筷频,或者是僅由字母 A 組成的字符串蚌成。
現(xiàn)在就請你為PAT寫一個(gè)自動(dòng)裁判程序,判定哪些字符串是可以獲得“答案正確”的凛捏。
輸入格式: 每個(gè)測試輸入包含1個(gè)測試用例担忧。第1行給出一個(gè)自然數(shù)n (<10),是需要檢測的字符串個(gè)數(shù)坯癣。接下來每個(gè)字符串占一行瓶盛,字符串長度不超過100,且不包含空格示罗。
輸出格式:每個(gè)字符串的檢測結(jié)果占一行惩猫,如果該字符串可以獲得“答案正確”,則輸出YES蚜点,否則輸出NO轧房。
分析:
由2,中間有PAT字樣绍绘,兩邊任意加同數(shù)量的A可得正確(數(shù)量可為0)奶镶。3中表述用的是如果,則其是根據(jù)1陪拘、2兩個(gè)條件得到的厂镇,aPbTc正確,由2得b=1左刽,a=c=x剪撬,那么aPbATca中,c+a=2x = (b+1)*a悠反。由此可得3滿足的條件為aPbTc中:a * b = c残黑。
輸入樣例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
輸出樣例:
YES
YES
YES
YES
NO
NO
NO
NO
#include <iostream>
#include <map>
using namespace std;
int main() {
int n, p = 0, t = 0;
string s;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> s;
map<char, int> m; //以字符為關(guān)鍵字建立map,保存PAT等關(guān)鍵字的數(shù)量
for(int j = 0; j < s.size(); j++) {
m[s[j]]++;
if (s[j] == 'P') p = j;
if (s[j] == 'T') t = j;
}
//滿足的條件:必須至少有PAT、PT最多出現(xiàn)一次斋否、PT之間必須有A梨水、P前面A的數(shù)量*PT之間A的數(shù)量=T后A的數(shù)量
if (m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t-p != 1 && p * (t-p-1) == s.length()-t-1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}