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. 基于 Keras 用深度学习预测时间序列

    目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...

  2. cifar数据集介绍及到图像转换的实现

    CIFAR是一个用于普通物体识别的数据集.CIFAR数据集分为两种:CIFAR-10和CIFAR-100.The CIFAR-10 and CIFAR-100 are labeled subsets ...

  3. TMS320VC5509的USB口通信

    1. 硬件如下,直接连接5509A的USB口即可 2. 测试如下,选择完器件型号之后会多出一个cmd文件,需要删除 3. 运行程序,电脑会出现USB安装驱动的提示 不过安装驱动遇到问题,应该是我电脑是 ...

  4. springmvc pager-taglib 分页,bootstrap样式

    注意: 嵌入到项目中时必须以带参形式访问: http://localhost:8081/DETECT-X/showConnLogsByPager.action?pageSize=5&pager ...

  5. C#简单的四位纯数字验证码

    验证码练手,整型.四位验证码 大体意思就是:四位纯数字验证,只要验证不成功就无限验证 刚开始在纠结怎么让整个过程循环起来,什么循环放到最外层,其实就是一个循环,看来自己的循环练习的还是不够多,不够灵活 ...

  6. cocos creator踩坑日记

    踩坑一 问题:项目在构建成Web Mobile后运行在浏览器和微信中,点击页面任何地方都会导致自动全屏 解决:在构建之后的main.js中,去掉 cc.view.enableAutoFullScree ...

  7. bootstrap学习笔记(4)

    bootstrap辅助类 总结几个常用的辅助类 .text-hide将页面元素所包含的文本设置为透明并且字体设置为0所以文本就看不见了 .hidden将页面的元素visible属性设置为hidden; ...

  8. [Selenium]如何通过Selenium实现Ctrl+click,即按住Ctrl的同时进行单击操作

    [以下是不负责任的转载……] 在自动化测试的过程中,经常会出现这样的场景: 按住Ctrl的同时,进行单击操作,已达到多选的目的 Actions a = new Actions(driver); a.k ...

  9. Scrapy爬取携程桂林问答

    guilin.sql: CREATE TABLE `guilin_ask` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `question ...

  10. Python学习之路:MINST实战第一版

    1.项目介绍: 搭建浅层神经网络完成MNIST数字图像的识别. 2.详细步骤: (1)将二维图像转成一维,MNIST图像大小为28*28,转成一维就是784. (2)定义好神经网络的相关参数: # M ...