题目分析:
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
那么正确的有这些:
PAT
APATA
AAPATAA
AAAPATAAA
…不说了,就是中间一个A左右加上等量的A(不加也行)都是正确的。
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
拿上面的那几个正确的举例子,那么正确的有这些:
PAT —— 对于 aPbTc 来说ac是空,b是A。所以 PAAT 是正确的。同理PAAAAAT中间加多少个A都是正确哒~
APATA —— 对于aPbTc来说,abc都是A。所以 APAATAA 是正确的。再类推一下,那么 APAAATAAA 是正确的。
AAPATAA —— 对于aPbTc来说,a和c是AA,b是A。所以AAPAATAAAA是正确的,再类推一下,AAPAAATAAAAAA 是正确的~
所以说规律就是,可以在P和T中间加A并且在T后面加A,要求必须是,中间加上一个A,末尾就得加上几倍的(P前面A的那个字符串)。换句话说就是,中间的A的个数如果是3,那么末尾的A的个数就得是开头A的个数的3倍。很巧,当中间A为一个的时候,末尾和开头A的个数必须相等正好是第二条的要求~~~
所以一句话总结字符串的要求:只能有一个P一个T,中间末尾和开头可以随便插入A。但是必须满足开头的A的个数 * 中间的A的个数 = 结尾的A的个数,而且P和T之间不能没有A~
代码实现:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
string s;
cin >> s;
int p = 0, t = 0;
map<char, int> mp;
for (int i = 0; i < s.size(); i++)
{
mp[s[i]]++;
if (s[i] == 'P') p = i;
if (s[i] == 'T') t = i;
}
/* 字符种类有三种,必须P和T的个数等于1,必须有A(P和T中间必须有A),开头A的个数乘以P和T中间A的个数等于末尾A的个数 */
if (mp.size() == 3 && mp['A'] != 0 && mp['P'] == 1 && mp['T'] == 1 && t - p != 1 && p * (t - p - 1) == s.size() - t - 1)
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}
真厉害 感谢感谢 折磨我一天的题终于清楚了 结果是个数学题