“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式:每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA输出样例:
YES YES YES YES NO NO NO NO
P.S:本题是一道对字符串处理的一道题,题目需要我们进行判断给出的一个字符串符不符合给出来的三个要求,第一个,必须含有P,A,T三个字符,且不能有其他的字符,而第二个则是只要形如xPATx的都是正确的,x需要是空的或A组成的字符串,比如 APATA, AAPATAA,等都符合要求,第三个的意思是aPbTc是正确的,而b至少为A,而此时aPbATca是正确的,假设b为A, aPAATca是正确的,由此可看出来其实T右边的A的数目等于P左边A的数组乘以P,T之间A的数目,这就是这个字符串正确的规律。
写一个方法来判断字符串是否正确,首先需要先将P,T的在字符串中的位置获取,这个可以使用find函数,如果P,T其中一个不存在或者PT中间没有A或P>T,那么必然是错误的,然后将字符串按P,T为分割线化成3个字符串,这样我们就可以对它的数目来判断了,如果这三个子串中有不是A的字符,那么必然是错的,如果这三个子串符合左右两边都是空的,或者左边的数目乘以中间的数目等于右边A的数目,那么这个字符串是正确的,其他的则都是错误的,此题结束,这里感谢一位博主的博客,一开始我并没有看出这个规律,所以一直不能通过。
写此道题目代码时,需要好好先看下字符串处理的一些系统本有的函数,比如我用到的find,string::npos,还有构造方法呀等一些函数。
c++ code:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
void check();
int main()
{
int N;
scanf("%d", &N);
for(int i=0;i<N;i++) {
check();
}
return 0;
}
void check()
{
string s;
cin>>s;
int indexP = s.find('P', 0);
int indexT = s.find('T', 0);
if(indexP==string::npos || indexT==string::npos || (indexP>=indexT-1)) {
printf("NO\n");
}else {
string a(s, 0, indexP);
string b(s, indexP+1, indexT-indexP-1);
string c(s, indexT+1, s.length()-indexT-1);
string k = a + b + c;
if(k.find_first_not_of('A') != string::npos){
printf("NO\n");
} else{
if(indexP == 0 && s.length()-indexT-1 == 0)
printf("YES\n");
else if(indexP * (indexT-indexP-1) == (s.length()-indexT-1))
printf("YES\n");
else
printf("NO\n");
}
}
}