题目 

解法:记P之前A的数量为ans1,T之后A的数量为ans2,PT之间A的数量为ans3

 

由任意形如 xPATx 的字符串都可以获得“答案正确”可知P之前的A数量和T之后的数量至少相等;又由如果 aPbTc 是正确的,那么 aPbATca 也是正确可知(递归),P和T之间有多少个b,T后面就有多少个c,此外最简单的正确项就是aPATa,所以初始的PT两边的a大小一致,所以有ans2==ans3*ans1时为正确项。

#include<iostream>
#include<string>
using namespace std;
bool f(string a) {
	int ans1=0,ans2=0,ans3=0;
	int flag=0;
	for(int i=0; i<a.size(); ++i) {
		if(flag==1) {//PT中间A数量
			if(a[i]!='A'&&a[i]!='T')
				return false;
			else if(a[i]=='T') {
				if(ans3)
					flag+=1;
				else return false;
			} else ans3++;
		} else if(!flag) {//P之前的A数量
			if(a[i]=='P')
				flag+=1;
			else if(a[i]!='A')
				return false;
			else ans1++;
		} else {//T之后的数量
			if(a[i]!='A')
				return false;
			else ans2++;
		}
	}
	if(ans2!=ans1*ans3||a.size()<3)
		return false ;
	return true;
}
int main () {
	int n;
	cin>>n;
	for(int i=0; i<n; ++i) {
		string a;
		cin>>a;
		if(f(a))
			cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}