1003 我要通过! (20 分)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

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

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

如果 aPbTc 是正确的,那么* aPbATca* 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 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

问题分析

问题分析启发自参考资料

条件1:

字符串中只有PAT三种字符

条件2:形如AAPATAA或者AAAAPATAAAA的都是对的,反正就是中间一个PAT,两遍要么没有A,要么A个数相同

条件3:若aPbTc成立,则aPbATca成立

根据条件三,有:

由于PAT成立,故PAAT成立,故PAAAT成立,....,故PA...T成立

由于APATA成立,故APAATAA成立,故APAAATAAA成立,...,故AP[n个A]T[n个A]成立

由于AAPATAA成立,故AAPAATAAAA成立,故AAPAAATAAAAAA成立,...,故AAP[n个A]T[n * 2个A]成立

所以,形如PA......T的一定是成立的

形如[n个A]P[m个A]T[n * m个A]也是成立的

归纳如下

只能有一个P和T且P必须在T前面;

其他字符,要么是A要么是空格;

P前面的A字符个数x,P和T之间的A字符个数y,T后面A字符个数z,三者满足x*y=z。

代码

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<string>str(n);//存放n个字符串,vector动态生成str[n]
vector<bool>result(n);//存放n个字符串的结果,vector动态生成result[n]
getchar(); //输
for (int i = 0; i < n; i++)//入
getline(cin, str[i]); //一行
for (int k = 0; k < n; k++)//判断每个字符串
{
bool flag = true; //是否通过的标志
int p = -1; //P的位置
int t = -1; //T的位置
for (int i = 0; i < str[k].size(); i++)
{//遍历该字符串
if (str[k][i] == 'A')
continue;
else if (str[k][i] == 'P')
{//事实证明下面7行只需要 p=i;
if (p == -1)//如果P还未使用
p = i;//记录P的位置
else//如果P已经用过了
{
flag = false;//失败
break;//退出遍历
}
}
else if (str[k][i] == 'T')
{//事实证明下面7行只需要 t=i;
if (t == -1)//如果t还未使用
t = i;//记录T的位置
else//如果t已经用过了
{
flag = false;//失败
break;//退出遍历
}
}
else//如果有其他字符
{
flag = false;//记录
break;//退出遍历
}
}
if (flag)
{//如果该字符串只有P、A、T三个字符串且P、T只有一个
if (t - p >= 2)//如果 T 在 P 的右边2个或更后的位置
{
int b = t - p - 1;//b 记录PT之间A的数量
int c = str[k].size() - t - 1;//c 记录 T 之后 A 的数量
int a = p;//a 记录P之前 A 的数量
if (a * b != c)
flag = false;
}
else
flag = false;
}
result[k] = flag;//记录该字符串的结果
}
for (int i = 0; i < n; i++)
{
if (result[i])
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}

参考资料

1、java-1003 我要通过! by. aptx1048576

2、1003. 我要通过!(20) by.小羊哈利

1003 我要通过!| PAT (Basic Level) Practice的更多相关文章

  1. PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642 题目描述: 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一 ...

  2. PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642 题目描述 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下 ...

  3. PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642 题目描述: "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大 ...

  4. PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642 题目描述: 拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每 ...

  5. PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 题目描述 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的 ...

  6. PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 目录 PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) ...

  7. PAT (Basic Level) Practice (中文)1057 数零壹 (20 分) (按行输入带空格的字符串)

    给定一串长度不超过 1 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0.多少 1.例如给定 ...

  8. PAT (Basic Level) Practice 1003 我要通过!分数 20

    "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&q ...

  9. PAT (Basic Level) Practice 1032 挖掘机技术哪家强

    个人练习 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 10​^5的正整数 N,即参赛人数 ...

随机推荐

  1. 关于Modelsim SE软件Fatal License Error的解决方法

    操作环境:Win7 32位系统 软件版本:Modelsim SE 10.1a Modelsim SE软件有时会弹出如图1所示“Fatal License Error”的提示信息,原因可能是软件破解不彻 ...

  2. 课下测试补交(ch01、ch02、ch07)

    课下测试补交(ch01.ch02.ch07) 课下测试ch01 1.Amdahl定律说明,我们对系统的某个部分做出重大改进,可以显著获得一个系统的加速比.(B) A . 正确 B . 错误 解析:课本 ...

  3. 补交课下测试(ch12并发编程) 08.第八周

    有关线程图,下面说法正确的是() A .图的原点表示没有任何线程完成一条指令的初始状态 B . 向右向上是合法的转换 C .向左向下是合法的转换 D .对角线是合法的转换 E .一个程序执行的历史被模 ...

  4. Oracle下各个NLS相关参数取得方法

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  5. c++ 方框中绘制菜单代码

    绘制静态菜单 getch与getchar 接收光标控制 一.绘制静态菜单 编写函数void mainmenu( void) 二.getch与getchar getch()的作用是从键盘接收一个字 ...

  6. 一维码Code 93简介及其解码实现(zxing-cpp)

    一维码Code 93: Code 93码与Code 39码的字符集相同,但93码的密度要比39码高,因而在面积不足的情况下,可以用93码代替39码.它没有自校验功能,为了确保数据安全性,采用了双校验字 ...

  7. node的 node-sass@^4.11.0 出现:npm: no such file or directory, scandir '.../node_modules/node-sass/vendor'

    解决办法: 查看node_modules文件夹,发现,并无vender 文件夹.如下图: 2.  在 node_modules/node-sass 下创建 vendor 文件夹 3.  最后运行: n ...

  8. java学习(三)类、实例

    类 public class Dog{ String breed; int age; String color; void barking(){ } void hungry(){ } void sle ...

  9. C语言操作符学习总结

    c语言中关于操作符部分的学习,可以主要分为两个部分:操作符和表达式. 这里首先是列举各种操作符,在C语言中,一般主要的操作符有这么几种:算数操作符,移位操作符,位操作符,赋值操作符,单目运算符,关系操 ...

  10. 编码 解码 python

    之前一直对python文件中编码解码糊里糊涂,今天看到一篇文章,觉得把我讲的有点明白了.写个心得吧. 1.编码解码是怎么一回事? Python 里面的编码和解码也就是 unicode 和 str 这两 ...