PAT B1003 我要通過!
阿新 • • 發佈:2019-02-10
algo 使用 spa aaa main out system 做了 空字符串 ”的。
“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬於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
#include <stdio.h> #include <algorithm> #include<string> #include <map> #include <iostream> #include <stack> using namespace std; int main(){ char s[101]; int n; scanf("%d\n", &n); for (int i = 0; i < n; i++){ char c = getchar(); int pos = 0, flag = 0, flag_a = 0; int p_num = 0, t_num = 0; int a_pre = 0, a_mid = 0, a_end = 0; while (c != ‘\n‘){ s[pos++] = c; if (flag==0 && (c == ‘P‘ || c == ‘A‘ || c == ‘T‘)){ if (flag_a == 0 && c == ‘A‘){ a_pre++; } else if (flag_a == 1 && c == ‘A‘){ a_mid++; } else if (flag_a == 2 && c == ‘A‘){ a_end++; } else if (c == ‘P‘ && p_num == 0 && flag_a == 0){ p_num++; flag_a++; } else if (c == ‘T‘ && t_num == 0 && flag_a == 1){ t_num++; flag_a++; } else{ flag = 1; } } else{ flag = 1; } c = getchar(); } //cout << flag << a_pre << a_mid << a_end<<endl; if (flag == 0 && p_num==1 && t_num==1){ if (a_end == a_pre * a_mid && a_mid>0)printf("YES\n"); else printf("NO\n"); } else printf("NO\n"); } system("pause"); }
一開始不知道該怎麽做,感覺要用叠代,但發現叠代式和叠代邊界都不好定義,主要是叠代邊界有點混亂,後來發現有規律,前面的A的個數*中間A的個數==後面A的個數。發現了這個規律後就好做了,但提交有個點一直錯誤,後來發現是忘記判定P和T有沒有出現過了。
註意點:除了滿足上面那個條件,還要滿足P和T都只出現了一次,並且P在T前面,中間一定要有A,讀字符使用了getchar,每輸入一個字符就獲得他。
PAT B1003 我要通過!