PAT-B 1003 我要通過!【規律+字串】

Enjoy_process發表於2019-02-15

                                            PAT-B 1003 我要通過!

                         https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192

 

 

題目

“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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'、'A'、'T'三個字元組成,如果有其他字元,則不合法,統計'P'、'A'、'T'三個字元的數量,且要都大於0。條件二,xPATx合法,說明”PAT“兩邊出現等數量的字元'A'合法。條件三,如果aPbTc合法,那麼aPbATca合法,首先考慮什麼時候aPbTc合法,由條件二知道,xPATx才合法,因此可知a=x 、b=A、c=x,所以條件三說的是

xPATx

xPAATxx

xPAAATxxx

xPAAAATxxxx

......

這些字串合法。

可以發現P前面的A的數量A1、P和T之間的A的數量A2、T之後A的數量A3,滿足

A1*A2=A3

C++程式

#include<iostream>
#include<algorithm>

using namespace std;

bool right(string s)
{
	int num_P=0,num_T=0,num_A=0,pos_P=-1,pos_T=-1;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='P')
		{
			num_P++;
			pos_P=i;//記錄字元'P'的位置 
		}
		else if(s[i]=='T')
		{
			num_T++;
			pos_T=i;//記錄字元'T'的位置 
		}
		else if(s[i]=='A')
		{
			num_A++;
		}
		else
		  return false;
	}
	if(num_P!=1||num_A==0||num_T!=1)
	  return false;
	int A1=pos_P,A2=pos_T-pos_P-1,A3=s.length()-pos_T-1;
	if(A1*A2==A3)
	  return true;
	return false; 
}

int main()
{
	int n;
	string s;
	cin>>n;
	while(n--)
	{
		cin>>s;
		if(right(s))
		  cout<<"YES"<<endl;
		else
		  cout<<"NO"<<endl;
	}
	return 0;
}

 

相關文章