您的位置:首页 > 其它

PAT Basic Level 1003 我要通过! (20 分)

2019-01-22 23:46 405 查看

题目链接:

https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192

考点:

分析:

任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
那么正确的有这些:
PAT
APATA
AAPATAA
AAAPATAAA
...不说了,就是中间一个A左右加上等量的A(不加也行)都是正确的。

如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
拿上面的那几个正确的举例子,那么正确的有这些:
PAT —— 对于 aPbTc 来说ac是空,b是A。所以 PAAT 是正确的。同理PAAAAAT中间加多少个A都是正确哒~
APATA —— 对于aPbTc来说,abc都是A。所以 APAATAA 是正确的。再类推一下,那么 APAAATAAA 是正确的。
AAPATAA —— 对于aPbTc来说,a和c是AA,b是A。所以AAPAATAAAA是正确的,再类推一下,AAPAAATAAAAAA 是正确的~ 
所以说规律就是,可以在P和T中间加A并且在T后面加A,要求必须是,中间加上一个A,末尾就得加上几倍的(P前面A的那个字符串)。换句话说就是,中间的A的个数如果是3,那么末尾的A的个数就得是开头A的个数的3倍。很巧,当中间A为一个的时候,末尾和开头A的个数必须相等正好是第二条的要求~~~

所以一句话总结字符串的要求:只能有一个P一个T,中间末尾和开头可以随便插入A。但是必须满足开头的A的个数 * 中间的A的个数 = 结尾的A的个数,而且P和T之间不能没有A~

(原文:https://blog.csdn.net/liuchuo/article/details/51994881 )

AC代码:

[code]#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
int n;
scanf("%d",&n);
while(n--){
int lp,np=0,lt,nt=0,other=0;
char str[110];
scanf("%s",str);
for(int i=0;i<strlen(str);i++){
if(str[i]=='P'){
lp=i;//字母P的位置
np++;
}
else if(str[i]=='T'){
lt=i;//字母T的位置
nt++;
}
else if(str[i]!='A'){
other++;
}
}
int x=lp,y=lt-lp-1,z=strlen(str)-lt-1;//分别计算各个区域内A的个数
if((np!=1)||(nt!=1)||(other!=0)||(lt-lp)<=1){//P与T中间至少有一个A所以lt-lp<=1,而不是(lt-lp)!=2
printf("NO\n");
continue;
}
if(x*y==z){
printf("YES\n");
}
else
printf("NO\n");
}
}


 

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