/*
题意:
判断给出的字符串是否PAT
解题:
1、记录p前面的A,P和T中间的A,T后面的A
2、如果中间的A变成一个的时候,需要Y - 1次回退,这时候z - (y - 1)x等于X,就代表程序正确
learn && wrong:
1、别忘了字符串可能压根不是PAT的情况,还有P和T的个数比较多的情况,以及P和T中间没有字符的情况
2、这些排除了,只需要计算那条公式就可以了(有位置推导出A的个数)
3、公式的推导也挺厉害的
4、你写的完全就直接是那条公式,错误多,也没考虑特殊情况
*/
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char** argv) {
int T;
cin >> T;
while (T--) {
char str[110];
cin >> str;
int len = strlen(str);
int num_p = 0, num_t = 0, other = 0; //代表P的个数、T的个数、除PAT意外其他字符的个数
int loc_p = -1, loc_t = -1;
for (int i = 0;i < len;++i) {
if (str[i] == 'P') { //若当前字符为P,P的个数+1,位置变为i
num_p++;
loc_p = i;
}
else if (str[i] == 'T') {
num_t++;
loc_t = i;
}
else if (str[i] != 'A') other++; //如果不是PAT中的一个,other++
}
if ((num_p != 1) || (num_t != 1) || other != 0 || (loc_t - loc_p) <= 1) {
printf("NO\n");
continue;
}
//x,y,z
int x = loc_p, y = loc_t - loc_p - 1, z = len - loc_t - 1; //注意从0开始,需要减一的
if (z - x * (y - 1) == x) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
return 0;
}
网友评论