1003 我要通過! (20 分)
阿新 • • 發佈:2018-12-14
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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
題意:
哇!這個題可真的是!一開始看了看題目,就覺得是水題,這不就是條件判斷嗎。
但是按照我的思維 APAAATAA 這個樣例結果應該是YES,因為算是符合aPbATca
原來!
最基本的前提就是隻能有P,A,T三種字元,並且有且必須只能有1個P和1個T,A的個數是≥1的。
其次的要求就是要滿足xPATx的形式。
然後最重要的是 如果能夠滿足aPbTc,那麼一定滿足aPbATca。可以看到在P和T之間多一個A字元,那麼T後面就必須多一個P前面的字串a。因為a,b,c都是由‘A’組成的。
假設P前面的字串中有x個‘A’,P與T之間的字串有y個‘A’,T之後的字串有z個‘A’。
那麼x*y=z。
xPATx : x*1=1 。
因為滿足a*b=c,所以 一定滿足a *(b+1) = a*b+a = c+a.
程式碼:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int main() { int t; scanf("%d",&t); char s[107]; while(t--) { int Pflag=0,Tflag=0; //P所在位置的下標,T所在位置的下標 int anum=0,pnum=0,tnum=0; //A的數量,P的數量,T的數量 int aanum=0,banum=0,canum=0; //P左邊的A的數量,P和T中間A的數量,T右邊的A的數量 scanf("%s",s); for(int i=0;i<strlen(s);i++) { if(s[i]=='A')anum++; else if(s[i]=='P') { Pflag=i; pnum++; } else if(s[i]=='T') { Tflag=i; tnum++; } } //按照條件可知: //P的個數有且只能是1,T的個數有且只能是1,A的個數最少是1 //並且字串中只能有這三種字元 if(pnum!=1||tnum!=1||anum==0||((pnum+tnum+anum)!=strlen(s))) { printf("NO\n"); } else { aanum=Pflag-0; //P左邊的A的數量 banum=Tflag-Pflag-1; //P和T之間的A的數量 canum=strlen(s)-Tflag-1; //T右邊的A的數量 if(canum==aanum*banum) printf("YES\n"); else printf("NO\n"); } } return 0; }