“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;\
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;\
3.如果 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
分析 :
条件3 的实例的意思就是,当b中多一个‘A’时,c要多 1 个 a字符串。
归纳总结:
1.P和T中必须有A
2.当为PAT时,字符串可为,APATA, AAPATAA,....
3.当为PAAT时,字符串可为,APAAPAA, AAPAATAAAA....
4.当为P‘A’ * nT时,字符串可为, (A)P (‘A’ * n) T(1 * (‘A’ * n)) , ....('A' * m)P(‘A’ * n)T(m * (‘A’ * n))
c中A的个数 = a中A的个数 * b中A的个数
#include <iostream>using namespace std; int main(void) {int n;cin >> n;while (n--) {string s;cin >> s;int countA = 0, countB = 0, countC = 0, countP = 0, countT = 0;int flag = 0;for (int i = 0; i < s.length(); i++) {if (s[i] != 'A' &&s[i] != 'P' &&s[i] != 'T' ) {flag = -1;break;}if (flag == 0 && s[i] == 'A') {countA++; }if (s[i] == 'P' && flag == 0) {flag = 1;countP ++;} else if (s[i] == 'P' && flag != 0) {flag = -1;break;} if (flag == 1 && s[i] == 'A') {countB++; }if (s[i] == 'T' && flag == 1) {flag = 2;countT ++; } else if (s[i] == 'T' && flag != 1) {flag = -1;break;}if (flag == 2 && s[i] == 'A') {countC++; }}if (flag!=-1 && countA * countB == countC && countB != 0 && countT && countP) {cout << "YES" <<endl;} else {cout << "NO" << endl;}}return 0;
}
简单方法:https://www.liuchuo.net/archives/460
#include <iostream>
#include <map>
using namespace std;
int main() {int n, p = 0, t = 0;string s;cin >> n;for(int i = 0; i < n; i++) {cin >> s;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 && p * (t-p-1) == s.length()-t-1)printf("YES\n");elseprintf("NO\n");}return 0;
}
map<char, int> m; 是声明一个map 索引为char类型 数据为int 型
m.size() == 3 确保了只有三种字符
p, t 记录了P 和 T 的位置
p * (t-p-1) == s.length()-t-1 非常巧妙 这里就是 c中A的个数 = a中A的个数 * b中A的个数这样写也保证了 P 在 T的前面