“答案正确”是⾃动判题系统给出的最令⼈欢喜的回复。本题属于PAT的“答案正确”⼤派送 —— 只要读⼊ 的字符串满⾜下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
- 任意形如
xPATx
的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字⺟ A 组 成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字 ⺟ A 组成的字符串。
现在就请你为PAT写⼀个⾃动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输⼊格式:
每个测试输⼊包含1个测试⽤例。第1⾏给出⼀个⾃然数n (<10),是需要检测的字符串个数。接下来每 个字符串占⼀⾏,字符串⻓度不超过100,且不包含空格。
输出格式:
每个字符串的检测结果占⼀⾏,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输⼊样例:
1 | 8 |
输出样例:
1 | YES |
分析:
1 |
|
本题解析:本题我做的时候是很很难的,即使第二次看也用了一个小时才搞明白,这道题按答案解析,主要在于理解题目,以及如果查找出a,b,c。
首先,题目给出了 3 个很有迷惑性的 “正确答案” 的条件,第 1 条,必须有仅有PAT三种字符很好理解,第二个为 XPATX,X 为空或 ’A‘,”AA“,”AAA“,··· 也好理解。关键第 3 个条件,如果aPbTc
是正确的,那么aPbATca
正确,也可以继续推第三代,第四代 ···,那么就需要考虑第一代原型是什么,而此时的第二个条件就为原型,且只有第二个条件为原型,这一定要理解,不然这题就废了。这样一看,原型也是有规律的,即b
必须为一个A
,且原型 a 的A
和C
的A
个数相等,即原型为PAT
,APATA
,AAPATAA
…再将每一个原型代入第三个条件进行推导会发现一个对所有字符串(满足条件1)都适用的规律,即c=a*b
。接下来就好多了,一个for
循环,判断s[i]=='P'
和s[i]=='T'
,找出 P 和 T 个数为 1。之后 y>x ,这道题基本难点也讲完了。
1 | s.find(P)=x,s.dind(y)=y,y>x |
本系列(PAT算法)作者mail:1302304703@qq.com(非本人)