1. 程式人生 > >PAT乙級1003 我要通過! (20 分)

PAT乙級1003 我要通過! (20 分)

答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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

解題關鍵:

 只能有一個P一個T,中間末尾和開頭可以隨便插入A。但是必須滿足開頭的A的個數 * 中間的A的個數 = 結尾的A的個數

#include <iostream>
#include<string>
#include <map>
using namespace std;
int main() {
	int n, p = 0, t = 0;//p,t為P和T的位置
	string s;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s;
		map<char, int> m;//建立一個圖,分別儲存對應的字母和個數
		for (int j = 0; j < s.size(); j++) {
			m[s[j]]++;
			if (s[j] == 'P') 
				p = j;
			if (s[j] == 'T') 
				t = j;
		}
		if (m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && p * (t - p - 1) == (s.length() - t - 1))
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}
	return 0;
}