1003 我要通过! (20 分)

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 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

问题分析

问题分析启发自参考资料

条件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. K9F2G08U0C NAND FLASH 的地址分析

    计算物理地址 K9F2G08U0C是samsun出产的FLASH,容量为256MB 页--Page: (2K + 64)Byte 块--Block: (128K + 4K)Byte 128 / 2 = ...

  2. 【转】比较详细的Asp伪静态化方法及Asp静态化探讨

    目前,各大搜索引擎如google.百度.雅虎已经对动态页面诸如asp,php有着不错的支持了,只要动态页面后面的参数不要太长,如控制在3个参数内,页面内容做点优化,各大搜索对该类页面收录甚至不比静态h ...

  3. WPF-学习笔记 动态修改控件Margin的值

    原文:WPF-学习笔记 动态修改控件Margin的值 举例说明:动态添加一个TextBox到Grid中,并设置它的Margin: TextBox text = new TextBox(); t_gri ...

  4. 【转载】COM小结

    原文:http://blog.csdn.net/byxdaz/article/details/6595210 一.Com概念 所谓COM(Componet Object Model,组件对象模型),是 ...

  5. 41-mysql作业

    1 2 3 4

  6. centos 中sshd莫名其妙不见了?

    发现问题 遇到问题:首先莫要慌:事出有因:先检查一波: 首先呢,看一下/var/log/yum.log  是否有误删的记录: 如有被误删的操作的话:可以去看看日志:到底咋回事: 然后么 yum ins ...

  7. JNDI是什么,怎么理解

    JNDI 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的 ...

  8. Design3:数据层次结构建模之二

    SQL Server提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌 ...

  9. 【译】2017年要学习的三个CSS新特性

    这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...

  10. leetcode_11. Container With Most Water

    leetcode_11. Container With Most Water 一,问题: Given n non-negative integers a1, a2, ..., an, where ea ...