“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
备注:来自http://pat.zju.edu.cn/contests/pat-b-practise/1003
1.没有使用string的find成员函数
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int num_str;
cin>>num_str;
if(num_str<=0 || num_str>=10)
return -1;
vector<string> str(num_str);
for(int i=0;i<num_str;++i)
{
cin>>str[i];
if(str[i].size()>100 ||str[i].size()<=0)
return -1;
}
for(int k=0;k<num_str;++k)
{
int pos_p=0;
int number_p=0;
int a_before_p=0;
int a_after_t=0;
int number_t=0;
int pos_t=100;
bool found_p=false;
bool over=false;
int middle_a=0;
for(int i=0;i<str[k].size();++i)
{
switch(str[k][i])
{
case 'P':
{
pos_p=i;
if(pos_p>pos_t)
{
over=true;
}
found_p=true;
number_p++;
break;
}
case 'T':
{
pos_t=i;
number_t++;
if(pos_t<pos_p)
{
over=true;}
break;
}
case 'A':
{
if(pos_t<i)
a_after_t++;
else if(!found_p)
a_before_p++;
else
middle_a++;
break;
}
default:
over=true;
}
if(over || number_p>1 || number_t>1)
break;
}
if( over || middle_a==0 ||number_t!=1 ||number_p!=1)
cout<<"NO\n";
else if(middle_a>1 && (a_before_p*middle_a)!=a_after_t)
cout<<"NO\n";
else if(middle_a==1 && a_before_p!=a_after_t)
cout<<"NO\n";
else
cout<<"YES\n";
}
return 0;
}
2.使用了string的find成员函数的见 http://blog.csdn.net/acm_ted/article/details/19835069