“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬於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
思路:
一開始半個多小時都無從下手,最后看了題解才明白是一個數學歸納法的簡單模擬題,而我想到kmp變形去了。。。
其實讀題的時候,看到第三個條件,. 如果 aPbTc 是正確的,那么 aPbATca 也是正確的。。中間增加一個A而右邊卻增加了一個a,增長呈現線性關系,P和T之間的A的總數增了一個,而T右邊卻增加了a,我們得以得出數學關系式
a中A的個數*(b中A的個數+1) = c中A的個數+a中A的個數
至此就可以編碼了
哦,還有一點細節
*PT中間必須要有A
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 6 using namespace std; 7 bool selectStr(char str[],int length) 8 { 9 10 for(int i=0; i<length; i++) 11 { 12 if(str[i]!='A' && str[i]!='P' && str[i]!='T') 13 return false; 14 else 15 return true; 16 } 17 } 18 int main() 19 20 { 21 int n; 22 char str[101]; 23 scanf("%d",&n); 24 while(n--) 25 { 26 memset(str,0,101); 27 scanf("%s",str); 28 int length = strlen(str); 29 if(selectStr(str,length)) 30 { 31 int lena = 0; 32 int lenb = 0; 33 int lenc = 0; 34 for(int i=0;i<length;i++) 35 { 36 if(str[i]!='P') 37 lena++; 38 else 39 break; 40 } 41 for(int i=0,cnt=0;i<length;i++) 42 { 43 if(str[i]!='T') 44 cnt++; 45 else 46 { 47 lenb = cnt-lena-1; 48 lenc = length-cnt-1; 49 break; 50 } 51 52 } 53 if(lenb == 0) 54 printf("NO\n"); 55 else 56 { 57 58 if(lena*lenb == lenc) 59 { 60 printf("YES\n"); 61 } 62 else 63 { 64 printf("NO\n"); 65 } 66 } 67 //test 68 69 } 70 else 71 { 72 printf("NO\n"); 73 } 74 75 } 76 77 return 0; 78 }