PAT乙级1003. 我要通过!(20)

来源:互联网 发布:金彩计划软件 编辑:程序博客网 时间:2024/05/20 05:46
1003. 我要通过!(20)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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

分析:先从简单的来,根据题目要求,字符串不能出现PAT以外的字符,且P和T仅能也必须出现一次,而且P和T之间至少要有一个A。

我们先从第二个条件开始,这时候开头和末尾的A是一样多的,然后再看第三个条件推得,中间每增加一个A,那么末尾就要接一个开头的长度。

因此,我们可以找到规律,字符串如果正确,那么还得满足a*b=c。

#include<iostream>#include<string>using namespace std;bool pass(string s)//判断字符串是否正确{int P_location = -1, T_location = -1;//P_location,T_location代表P,T字符串的位置int a, b, c, i;//a,b,c分别代表P之前的A的个数,P和T之间的A的个数,T之后A的个数for (i = 0; i < s.length(); i++){if (s[i] != 'P'&&s[i] != 'T'&&s[i] != 'A')//如果出现不是PAT的字符那么错误return false;if (s[i] == 'P')//如果该字符是Pif (P_location>=0)//如果P的位置大于等于0,即已经出现过一次P了,判错return false;elseP_location = i;//记下P的位置if (s[i] == 'T')//如果该字符是Tif (T_location>=0)//如果P的位置大于等于0,即已经出现过一次P了,判错return false;elseT_location = i;//记下T的位置}if (P_location < 0 || T_location < 0)//如果P,T的位置小于0,说明字符串中没有P,T,判错return false;a = P_location;//算出ab = T_location - P_location - 1;//算出bc = s.length() - T_location - 1;//算出cif (b == 0)return false;//如果PT之间没有一个A也判错if (a*b != c)//如果不满足规律判错return false;return true;//经错层层筛选,这个字符串就是对的了}int main(){int N,i;string s;cin >> N;for (i = 1; i <= N; i++){cin >> s;if (pass(s))cout << "YES" << endl;//正确elsecout << "NO" << endl;//错误}}






原创粉丝点击