原題網址:https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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
思路:
條件2和3一組合,其實是一道數學題,就是(P前面的A的數目)*(P和T之間A的個數)=(T之後的A的格式),當然前提是字符串有且只有一個P和T。
#include<stdio.h>
#include<string.h>
bool judge(char *p)
{
int chang=strlen(p);
int x,y,z; //x是P前面的字符的個數,y是P和T之間字符的個數,z是T之後字符的個數
int countp,counta,countt;// 用於統計字符串中P、A、T的個數
x=y=z=0;
countp=counta=countt=0;
//找P
for(int i=0;i<chang;i++)
{
if(p[i]=='P')
{
x=i;
countp++;
}
}
//找A
for(int i=0;i<chang;i++)
{
if(p[i]=='A') counta++;
}
//找T
for(int i=0;i<chang;i++)
{
if(p[i]=='T')
{
y=i-x-1;
countt++;
}
}
z=chang-x-y-2;
if(counta==0) return false;
if(countp!=1||countt!=1) return false;
if((countp+counta+countt)!=chang) return false;
if(x*y!=z) return false;
return true;
}
int main()
{
//輸入數據
int n;
scanf("%d",&n);
char s[101];
// 依次判斷
for(int i=0;i<n;i++)
{
scanf("%s",&s);
if(judge(s))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}