“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
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
题目分析:
若aPbTc正确,需满足条件2,则b不能为空。由条件2,xPATx才为真。则对任意形式,设P左侧A数目为x,PT间A的数目为y,T右侧A数目为z,有z = x*y。
在做到时候测试点2一直过不去,想了一下发现需要注意P、T都只能出现一次,且P在T前。
代码样例:
n = int(input())
for i in range(n):
x = input()
# 将输入从P、T分成三段
cut = ["", "", ""]
# 遍历时添加元素进入cut的初始位置为零、标志为真
cut_line, sign = 0, True
for j in x:
# 遇A则添加
if j == 'A':
cut[cut_line] += j
# 首次遇P,且T尚未出现,添加位置的下角标进1
elif j == 'P' and cut_line == 0:
cut_line += 1
# 首次遇T,且之前遇P1次,添加位置的下角标进1
elif j == 'T' and cut_line == 1:
cut_line += 1
else:
sign = False
break
# 标志为Ture,且P、T均只有一个,判断cut三部分的关系
if sign is True and cut_line == 2:
# P、T中间有A,且T右侧A数目为:PT间A数目乘P左侧A数目
if len(cut[1]) >= 1 and cut[2] == len(cut[1])*cut[0]:
print("YES")
# 中间为空或不满足数量关系
else:
print("NO")
else:
print("NO")