题目:
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
解析:
首先,分析三个条件所带来的信息:
条件一:存在P、A、T以外的字符都是''答案错误"。
条件二:PAT或xPATx这两种情况是正确的。
这里要注意x为A字符串可以为多个'A'组成,并且两边需要一样多的'A'。例如,APATA,AAPATAA...依次类推;
这里还要注意的是,P与T中至少需要存在一个'A',也就是说字符串PT是''答案错误''的
条件三:如果aPbTc正确那么aPbATca也正确,这里意思是说上面正确的两种情况可以推出其余正确的字符串。
①PAT正确(a,c为空,b为'A')PAAT正确PAAAT正确,依次类推,可以总结出P(n)AT是正确的,这里(n)A是n个'A'的意思,例如P(3)AT = PAAAT。
②xPATx正确(a为'x',c为'x',b为'A')xPAATxx正确xPAAATxxx正确,依次类推,可以总结出
xP(n)AT(n)x是正确的情况,这里(n)A是n个'A'的意思,(n)x同理;
需要注意的是,这里的x同样可以是多个'A'组成的字符串,例如AAPATAA正确(条件二)AAPAATAAAA正确AAPAAATAAAAAA正确,依次类推,也是满足xP(n)AT(n)x(在这里,AAPATAA中x为'AA')
综上可以总结出所有答案正确的情况:
1.PAT 2.xPATx 3.P(n)AT 4.xP(n)AT(n)x
值得注意的是,前三种字符串都是第四种的特殊情况:
第四种情况可以表达为(n1)AP(n2)AT(n1*n2)A,这里n1为字符'P'前'A'的数量;n2为字符'P'后,'T'前'A'的数量;n1*n2为字符'T'后'A'的数量。
第一种是n1=0,n2=1的情况;第二种是n1!=0,n2=1的情况;第三种是n1=0,n2!=0的情况
那么根据通式,我们将可以判断一个字符串是否是'答案正确'的
代码(C++):
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool stringIsTure(string s) {
int n = s.size();
//分别统计P和T的个数
int cnt_P{0}; int cnt_T{0};
//0,1,2分别表示'A'在P前,P后T前,T后的个数
int cnt_0{}; int cnt_1{}; int cnt_2{};
if (s == "PAT") return true; //最简单的情况,直接返回
for (int i = 0; i < n; i++) {
if (s[i] != 'P' && s[i] != 'A' && s[i] != 'T') return false;
else if (s[i] == 'A') {
if (cnt_P == 0 && cnt_T == 0) cnt_0++;
else if (cnt_P == 1 && cnt_T == 0) cnt_1++;
else if (cnt_P == 1 && cnt_T == 1) cnt_2++;
}
else if (s[i] == 'P') cnt_P++;
else if (s[i] == 'T') cnt_T++;
}
//需要注意的是,cnt1的个数至少为1,也就是P与T中间至少需要有1个A; PT是答案错误的
//P与T的数量只能为1
if (cnt_P != 1 || cnt_T != 1 || !cnt_1) return false;
//通式判断
if (cnt_0 * cnt_1 == cnt_2) return true;
return false;
}
int main() {
int n; cin >> n;
vector<string> s(n);
for (int i = 0; i < n; i++) {
cin >> s[i];
if (stringIsTure(s[i])){
s[i] = "YES";
}
else s[i] = "NO";
}
for (auto it : s) {
cout << it << endl;
}
}
测试通过:
个人拙见,欢迎讨论