1003 我要通过!
/*
1. 本题成立条件:
①只存在'P', 'A', 'T'三种字符;
'P', 'T'只能出现一次并且按照该顺序先后出现;
P&T之间不能没有A;
m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t-p != 1
②数学公式:T之后A的数量 = P之前A的数量 × P&T中间A的数量
PAT p前面有0个A,pt之间有1个A,T 后面有0个A, 0*1=0 正确
PAAT p前面有0个A,pt之间有2个A,T 后面有0个A, 0*2=0 正确
AAPATAA p前面有2个A,pt之间有1个A,T 后面有2个A, 2*1=2 正确
AAPAATAAAA p前面有2个A,pt之间有2个A,T 后面有2个A, 2*2=4 正确
p * (t-p-1) == s.length()-t-1
2. 考察字符标志位置的记录 :
int p = 0, t = 0;
if (s[j] == 'P') p = j;
if (s[j] == 'T') t = j;
3. 考察map数据结构的使用:
map<char, int> m;
m[s[j]]++; //记录字符串中的字符类型数量
4.参考文章:
1.https://www.liuchuo.net/archives/460
2.https://www.jianshu.com/p/2700af335690
3.https://www.cnblogs.com/zle1992/p/5893564.html
*/
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n;
//记录坐标,运用数学公式
int p = 0, t = 0;
string s;
cin >> n;
for(int i = 0; i < n; i++){
cin >> s;
//统计P,T个数
map<char, int> m;
for(int j = 0; j < s.size(); j++){
m[s[j]]++;
if (s[j] == 'P') p = j;
if (s[j] == 'T') t = j;
}
//成立条件
if(m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t-p != 1 && p * (t-p-1) == s.length()-t-1)
cout << "YES" <<endl;
else
cout << "NO" <<endl;
}
return 0;
}