您的位置:首页 > 其它

PAT-B 1003. 我要通过!(20)

2017-03-21 19:50 218 查看
题目链接在此

题意理解

这个题目最主要的还是理解题意了,这三个条件之间除了有各自的意思,还能通过结合来引申出不同的正确的字符串,并且相互制约,看一下那三个条件:

字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;

任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;

如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

由条件1.2可知:

1. “PAT”是最原始的字符串

2. 通过2可引申出“APATA”、“AAPATAA”、“AAAPATAAA”等等形式都是正确的

条件3的意思是,满足aPbTc这种形式的字符串(比如AAPATAA,由条件2知道a和c一定相等),在P和T之间加入一个A之后,需要在T的左边加上P的右边A的个数个A,那么AAPATAA在PT之间加上一个A之后就会变成AAPAATAAAA。

综上,可以得到如下几条

1. 只能有P,A,T这三种字符,有其他字符直接输出NO

2. PAT是最原始的形式,条件2对应的字符串是最底层的模式,最底层模式是指PT之间只能有一个A,且只能有一个P和一个A

3. 如果想在“PAT”中P的左边加上A,则右边也要加上相等数量的A

4. 在“mPATm”(m表示m个A)中的P、T中间加上n个A,则T的右边需要加上m*n个A,由此得到下一条:

5. 记P之前的A的个数为x,PT之间的个数为y,T之后A的个数为z,x,y,z满足x*y==z

到此,相信思路已经很清晰了,只要找到P和T的位置,这样就能得出P之前、PT之间以及T之后的A的个数,通过总结5的关系式就可以得出结果。

AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int main(){

int n;
char str[100];

scanf("%d",&n);

while(n--){ //需要验证n个字符串
scanf("%s",str); //读入字符串

int len = strlen(str);
int numP = 0, numT = 0, other = 0; //P,T,除PAT以外其他字符的数目<
4000
/span>
int posP = -1, posT = -1; //P,T所在下标
for(int i = 0; i < len; i++){
if(str[i] == 'P'){ //如果当前位为P
numP++; //P的数量+1
posP = i; //记录好P的位置
}else if(str[i] == 'T'){ //如果当前位为T
numT++; //T的数量+1
posT = i; //记录好T的位置
}else if(str[i] != 'A'){ //如果当前位不是P,A,T其中之一
other++;  //其他字符数量+1
}
}

if(other > 0 || numP != 1 || numT != 1 || posT-posP<=1 ){ //如果有其他字符,或者PT的数量不是1 ,或者PT之间没有A(这种容易忽略)
printf("NO\n"); //直接输出NO
}else{ //满足条件1
int x = posP; //P之前A的个数
int y = posT-posP-1; //PT之间A的个数
int z = len-posT-1; //T之后A的个数
if(x*y == z){ //满足要求
printf("YES\n");
}else{ //不满足要求
printf("NO\n");
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: