1003 我要通过! (20 分)

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

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

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

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

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

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出* YES,否则输出NO*。

输入样例:

  1. 8
  2. PAT
  3. PAAT
  4. AAPATAA
  5. AAPAATAAAA
  6. xPATx
  7. PT
  8. Whatever
  9. APAAATAA

输出样例:

  1. YES
  2. YES
  3. YES
  4. YES
  5. NO
  6. NO
  7. NO
  8. 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。

代码

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using namespace std;
  5. int main()
  6. {
  7. int n;
  8. cin >> n;
  9. vector<string>str(n);//存放n个字符串,vector动态生成str[n]
  10. vector<bool>result(n);//存放n个字符串的结果,vector动态生成result[n]
  11. getchar(); //输
  12. for (int i = 0; i < n; i++)//入
  13. getline(cin, str[i]); //一行
  14. for (int k = 0; k < n; k++)//判断每个字符串
  15. {
  16. bool flag = true; //是否通过的标志
  17. int p = -1; //P的位置
  18. int t = -1; //T的位置
  19. for (int i = 0; i < str[k].size(); i++)
  20. {//遍历该字符串
  21. if (str[k][i] == 'A')
  22. continue;
  23. else if (str[k][i] == 'P')
  24. {//事实证明下面7行只需要 p=i;
  25. if (p == -1)//如果P还未使用
  26. p = i;//记录P的位置
  27. else//如果P已经用过了
  28. {
  29. flag = false;//失败
  30. break;//退出遍历
  31. }
  32. }
  33. else if (str[k][i] == 'T')
  34. {//事实证明下面7行只需要 t=i;
  35. if (t == -1)//如果t还未使用
  36. t = i;//记录T的位置
  37. else//如果t已经用过了
  38. {
  39. flag = false;//失败
  40. break;//退出遍历
  41. }
  42. }
  43. else//如果有其他字符
  44. {
  45. flag = false;//记录
  46. break;//退出遍历
  47. }
  48. }
  49. if (flag)
  50. {//如果该字符串只有P、A、T三个字符串且P、T只有一个
  51. if (t - p >= 2)//如果 T 在 P 的右边2个或更后的位置
  52. {
  53. int b = t - p - 1;//b 记录PT之间A的数量
  54. int c = str[k].size() - t - 1;//c 记录 T 之后 A 的数量
  55. int a = p;//a 记录P之前 A 的数量
  56. if (a * b != c)
  57. flag = false;
  58. }
  59. else
  60. flag = false;
  61. }
  62. result[k] = flag;//记录该字符串的结果
  63. }
  64. for (int i = 0; i < n; i++)
  65. {
  66. if (result[i])
  67. cout << "YES" << endl;
  68. else
  69. cout << "NO" << endl;
  70. }
  71. return 0;
  72. }

参考资料

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. php数组 组合排列 笛卡尔积

    function Descartes() { $t = func_get_args(); if (func_num_args() == 1) { return call_user_func_array ...

  2. PHP各环境下的伪静态配置

    一.Apache的伪静态配置 1.网站根目录下需要有 .htaccess 文件,没有则自己创建一个,内容为 <IfModule mod_rewrite.c> RewriteEngine o ...

  3. Django:settings中关于static静态文件目录的设置

    django项目settings中关于静态资源存放位置的设置 主要涉及以下3项:STATIC_URL.STATICFILES_DIR和STATIC_ROOT 1.STATIC_URL 这项是必须配置的 ...

  4. SEO优化上首页之搜索引擎原理内容处理与索引

    上文<搜索引擎原理SEO优化上首页之蜘蛛Spider>详细介绍了蜘蛛的分类.抓取入口.抓取策略和更新策略.搜索引擎已把页面抓取回来,接下来是解析页面内容,主要包含判断页面类型.提取页面主题 ...

  5. 从0开始学golang--1.1--连接ms sql server数据库

    package main import (     "database/sql"     "fmt"     "strings" ) imp ...

  6. 关于Matlab在绘图时中文字体显示不一致的问题

    我的运行环境: OS: Win10 教育版 64-bit Matlab版本:Matlab 2017a  64-bit 在使用Matlab绘图时,而横坐标轴.纵坐标轴.标题有汉字时,会发现在GUI的显示 ...

  7. Unity3d之Hash&Slash学习笔记(一)--角色属性类的构架

    角色属性类的构架 角色属性类有8个类,继承关系如下图: 每个类的具体作用见之后的随笔

  8. 【JUC源码解析】DelayQueue

    简介 基于优先级队列,以过期时间作为排序的基准,剩余时间最少的元素排在队首.只有过期的元素才能出队,在此之前,线程等待. 源码解析 属性 private final transient Reentra ...

  9. 【RAC搭建报错】You need disks from at least two different failure groups, excluding quorum disks and quorum failure groups, to create a Disk Group with normal redundancy

    报错: You need disks from at least two different failure groups, excluding quorum disks and quorum fai ...

  10. 运行用例时,报错Unknow Error:Element xxx is not clickable……的解决方法

    P.S:近期selenium官方更新了版本以解决此问题 通常这种情况是由于在点击该元素时,js更换了元素属性造成的. 所以可以采用js的方式进行处理 方法如下: WebDriver driver = ...