題目:
「答案正確」是自動判題系統給出的最使人歡喜的回覆。本題屬於 PAT 的「答案正確」大派送 —— 只要讀入的字符串知足下列條件,系統就輸出「答案正確」,不然輸出「答案錯誤」。測試
獲得「答案正確」的條件是:spa
- 字符串中必須僅有
P
、A
、T
這三種字符,不能夠包含其它字符; - 任意形如
xPATx
的字符串均可以得到「答案正確」,其中x
或者是空字符串,或者是僅由字母A
組成的字符串; - 若是
aPbTc
是正確的,那麼aPbATca
也是正確的,其中a
、b
、c
均或者是空字符串,或者是僅由字母A
組成的字符串。
如今就請你爲 PAT 寫一個自動裁判程序,斷定哪些字符串是能夠得到「答案正確」的。code
輸入格式:
每一個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<),是須要檢測的字符串個數。接下來每一個字符串佔一行,字符串長度不超過 100,且不包含空格。blog
輸出格式:
每一個字符串的檢測結果佔一行,若是該字符串能夠得到「答案正確」,則輸出 YES
,不然輸出 NO
。字符串
輸入樣例:
8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA
輸出樣例:
YES YES YES YES NO NO NO NO
剛開始看題目感受不是很理解,幾回都沒過,只能怪本身語文很差,後來才發現是一個簡單的數學規律,發現規律後就很簡單了。數學
解析:
根據樣例裏的這三組和其輸出結果能夠發現:AAPATAA--YES; AAPAATAAAA--YES;
APAAATAA--NO。只要P前面的A的個數乘以PT之間的A的個數的積等於T後面的A的個數且字符串中只含有單個P和T就爲YES,不然NO。即條件三中符合a*b=c。而後看條件二不難發現:條件二包含在條件三中。知道這些後,就能夠經過了。
string
代碼:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int n; 7 scanf("%d",&n); 8 while(n--) 9 { 10 char s[105]; 11 int cnt_p = 0, cnt_t = 0, other = 0; 12 int flag_p, flag_t; 13 scanf("%s",s); 14 int len = strlen(s); 15 for(int i = 0; i < len; i++) 16 { 17 if(s[i] == 'P') 18 { 19 cnt_p++; //記錄P的個數 20 flag_p = i; //標記P位置 21 } 22 else if(s[i] == 'T') 23 { 24 cnt_t++; //記錄T的個數 25 flag_t = i; //標記T位置 26 } 27 else if(s[i] != 'A'){ 28 other++; //記錄其餘字符個數 29 } 30 } //上述三個條件語句中判斷是否爲A字符的必須放在最後,否則P和T會干擾 31 if((cnt_p != 1) || (cnt_t != 1) || other || (flag_t - flag_p <= 1)) 32 printf("NO\n"); 33 else if(flag_p * (flag_t-flag_p-1) == len - flag_t - 1) 34 printf("YES\n"); 35 else 36 printf("NO\n"); 37 } 38 return 0; 39 }
總結:
仔細讀題,善於發現規律。io