1003 我要通过!
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到**“答案正确”**的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得**“答案正确”**,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
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
分析,三个条件要满足
在一中,只有P
、A
、T
三个字符,在二中x
表示满足 空格 或者 字符串,在三中表示满足前条件后条件也满足。
由二三得到,APATA => APAATAA
再推出 APAATAA => ATPAAATAAA
以此类推 …
得出
a*b = c
即可解决
#include<stdio.h>
#include<string.h>
int main()
{
char a[101];int n,t,b[10] = {
0,0,0,0,0,0,0,0,0,0};int s1 = 0,s2 = 0,s3 = 0;int count_P_T;int sign1,sign2;scanf("%d",&t);for(int q = 0;q < t;q++){
scanf("%s",a);n = strlen(a);s1 = 0;s2 = 0;for(int i = 0;i < n;i++){
if(a[i] == 'P'){
sign1 = i;s1++;}}for(int i = 0;i < n;i++){
if(a[i] == 'T'){
sign2 = i;s2++;}}if(sign1 >= sign2){
continue;}if(a[sign1+1] == 'A' && sign1+2 == sign2){
if(sign1 == n-sign2-1 && sign1 == 0){
if(s1 == 1 || s2 == 1){
b[q] = 1;continue;}}if(sign1 + sign2 == n-1 && sign1 != 0){
int flag = 0;for(int i = 0;i < sign1;i++){
if(a[i] != 'A'){
flag = 1;break;}}for(int i = sign2+1;i < n;i++){
if(a[i] != 'A'){
flag = 1;break;}}if(flag == 0){
if(s1 == 1 || s2 == 1){
b[q] = 1;continue;}}}}else if(sign1+1 < sign2){
count_P_T = sign2 - sign1 - 1;if(n-sign2-1 == count_P_T*(sign1)){
int flag = 0;for(int i = 0;i < sign1;i++){
if(a[i] != 'A'){
flag = 1;break;}}for(int i = sign2+1;i < n;i++){
if(a[i] != 'A'){
flag = 1;break;}}if(flag == 0){
if(s1 == 1 || s2 == 1){
b[q] = 1;continue;}}}}}for(int i = 0;i < t;i++){
if(b[i] == 0){
printf("NO\n");}elseprintf("YES\n");}return 0;
}