1. 程式人生 > >1003 我要通過! (20 分)

1003 我要通過! (20 分)

答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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

 題意:

哇!這個題可真的是!一開始看了看題目,就覺得是水題,這不就是條件判斷嗎。

但是按照我的思維 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;
}