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

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

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 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) (2) 知,有 2 种基本情况是 “正确” 的,即 PAT 和 xPATx;
  • 由条件 (3) 知,其余 “正确” 情况都是由那 2 种基本情况不断演变而来。

因此我想到的是递归暴力法:

  • 首先判断 2 种基本情况为 “正确”。
  • 要想 aPbATca “正确”,就要 aPbTc “正确”,于是用 string.find() 找到 aPbATca 中 'P' 和 'AT' 的下标,通过 string.substr() 截取字符串获得 aPbTc,递归判断 aPbTc 是否 “正确”。
 #include <iostream>
#include <string> using namespace std; bool onlyA(string s) {
for (int i = ; i < s.size(); i++)
if (s[i] != 'A')
return false;
return true;
} bool isCorrect(string s) {
if (s == "PAT") return true;
else if (s.find("PAT") != string::npos) {
int idx = s.find("PAT");
string x1 = s.substr(, idx), x2 = s.substr(idx + );
if (onlyA(x1) && onlyA(x2) && x1 == x2)
return true;
}
else if (s.find("P") != string::npos) {
int p_idx = s.find("P");
string a1 = s.substr(, p_idx);
string a2 = s.substr(s.size() - p_idx);
if (onlyA(a1) && onlyA(a2) && a1 == a2 && s.find("AT") != string::npos) {
int at_idx = s.find("AT");
string b = s.substr(p_idx + , at_idx - p_idx - );
string ca = s.substr(at_idx + );
string c = ca.substr(, ca.size() - a2.size());
if (isCorrect(a1 + "P" + b + "T" + c))
return true;
}
else {
return false;
}
}
return false;
} int main() {
int n;
cin >> n;
string *s = new string[n];
for (int i = ; i < n; i++)
cin >> s[i];
for (int i = ; i < n; i++) {
if (isCorrect(s[i]))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return ;
}

后来查看网上解析,总结题意发现:

  1. 基本情况是 xPATx,x 只含有 'A' 或为空。这里我们用 a、b、c 表示原题中相应位置  'A' 的数量,则初始情况下,a = c,b = 1。
  2. 由条件(3),'P' 和 'T' 中间每增加 1 个 'A',即 b + 1 后,整个字符串结尾要添加 1 个 'P' 前的字符串,即 c 变为 c + a。
    由初始状态 b = 1,且若 b = b + 1,则 c = c + a,可知 c = a × b

挖掘到这个深层信息,改写 isCorrect() 函数如下,效率会更高。

// C style
bool isCorrect(string s) {
int a = , b = , c = ;
bool hasP = false, hasAT = false;
for (int i = ; i < s.size(); i++) {
if (!hasP) {
if (s[i] == 'A') {
a++;
continue;
}
else if (s[i] == 'P') {
hasP = true;
continue;
}
else {
return false;
}
}
else {
if (!hasAT) {
if (s[i] == 'A') {
b++;
continue;
}
else if (s[i] == 'T' && s[i - ] == 'A') {
hasAT = true;
continue;
}
else {
return false;
}
}
else {
if (s[i] == 'A') {
c++;
continue;
}
else {
return false;
}
}
}
}
if (hasP && hasAT && a * b == c)
return true;
else
return false;
} // C++ style
bool isCorrect(string s) {
int idxP = s.find("P"), idxAT = s.find("AT");
if (idxP != string::npos && idxAT != string::npos) {
for (int i = ; i < idxP; i++) {
if (s[i] != 'A')
return false;
}
for (int i = idxP + ; i < idxAT; i++) {
if (s[i] != 'A')
return false;
}
for (int i = idxAT + ; i < s.size(); i++) {
if (s[i] != 'A')
return false;
}
// a * b == c
if (idxP * (idxAT - idxP) == (s.size() - idxAT - ))
return true;
}
return false;
}

【PAT】我要通过!的更多相关文章

  1. 《转载》PAT 习题

    博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...

  2. PAT Judge

    原题连接:https://pta.patest.cn/pta/test/16/exam/4/question/677 题目如下: The ranklist of PAT is generated fr ...

  3. PAT/字符串处理习题集(二)

    B1024. 科学计数法 (20) Description: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+ ...

  4. PAT 1041. 考试座位号(15)

    每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...

  5. PAT 1040. 有几个PAT(25)

    字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问 ...

  6. PAT 1032. 挖掘机技术哪家强(20)

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

  7. pat甲级题解(更新到1013)

    1001. A+B Format (20) 注意负数,没别的了. 用scanf来补 前导0 和 前导的空格 很方便. #include <iostream> #include <cs ...

  8. PAT (Basic Level) Practise 1040 有几个PAT(DP)

    1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单 ...

  9. PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)

    1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...

  10. PAT——乙级真题1003代码

    #include<iostream> #include<string> using namespace std; int getLength(string str0); int ...

随机推荐

  1. vue router相关用法

    router.push(location) 想要导航到不同的 URL,则使用 router.push 方法.这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之 ...

  2. day014 模块

    # 1.用于多种语言交互 编程语言通用数据 # 内置的 不需要安装 直接导入使用 import json # 导入一个json模块 # dumps loads# dump load 有持久化的功能 # ...

  3. jenkins配置工程目录-启动case

    1.我们在python里面编辑的脚本可以正常跑,但是在cmd里面跑就不行了,找不到自己定义的方法模块,这个时候我们要搞个环境变量 name  :   PYTHONPATH   val : 工程目录路劲 ...

  4. to_date

    SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 会话已更改. SQL> SELECT TO_DATE(' ...

  5. php redis队列操作

    php redis队列操作 rpush/rpushx 有序列表操作,从队列后插入元素:lpush/lpushx 和 rpush/rpushx 的区别是插入到队列的头部,同上,'x'含义是只对已存在的 ...

  6. Oarcle的开始

    1.数据库大致分类两种 1.关系型数据库(SQL) Oracle.Mysql(80%).DB2.Microsoft SQL Server.ProsgreSQL.Access.SQLSite 2.非关系 ...

  7. 绑定到外部验证服务LDAP、配置 autofs

    题1:您的系统需要按照以下要求绑定到这个服务上:验证服务器的基本 DN 是: dc=xxxx,dc=xxxx,dc=xxxx. 帐户信息和验证信息都是由 LDAP 提供的.连 接 需 要 使 用 证 ...

  8. 剑指offer(25)复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  9. flask --- 01 .初始

    一. 四种web框架比较 Django : 优点 - 大而全所有组件都是有组织内部开发高度定制化 教科书级别的框架 缺点 - 大到浪费资源,请求的时候需要的资源较高 Flask : 优势 - 小而精, ...

  10. topcoder srm 570 div1

    problem1 link 找到周期,每个周期的增量是相同的. problem2 link 对于分给某一个公司的有$c$个联通分量,其中$k$个联通分量只有1个节点,$c$个联通分量一共有$x$个节点 ...