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

思路:
一開始半個多小時都無從下手,最后看了題解才明白是一個數學歸納法的簡單模擬題,而我想到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 }

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM