1003. 我要通过!
来源:互联网 发布:单片机照明控制现状 编辑:程序博客网 时间:2024/06/05 01:15
一、题目
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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
二、个人理解
此题的关键在于理解题意,如果不理解题意而盲目做题,很容易跳进坑中。
首先题目有三个要求:
- 要求一和要求二很简单,而且要求二“xPATx”涵盖了要求一“PAT”,所以编程中可以直接先写要求二。
- 要求三特别关键,这是整道题目的坑人之处。首先“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”这句话中aPbTc有两中正确方式:
(一)、满足“PAT”,那么“PAAT”正确;接着如果“PAAT”正确,则“PAAAT”也正确。以此类推。
(二)、满足“aPATa”,那么“aPAATaa”正确;如果“aPAATaa”正确,那么“aPAAATaaa”……其中a可以表示空字符串,或者是仅由字母 A 组成的字符串。这里我们可以明显发现这样迭代下去,中间“A”的数量×最左边a的数量=最右边a的数量。
代码实现方式:
1.Python
利用正则表达式,实现算法。
#!/usr/bin/env python# encoding: utf-8import re #导入正则表达式库num=input()i=0result=[]while(i<int(num)): test=input() if(re.compile(r"A*PA+TA*").match(test)): #初步匹配符合“PAT”、“PAAT ”、“AAPATAA”、 “APAAATA”等,其中含有错误匹配 tag1=re.compile(r"PA+T").search(test).group(0)[1:-1] #取出最左边的A至P的字符串,但不含有P tag2=re.compile(r"A*P").search(test).group(0) #取出P和T之间的A tag3=re.compile(r"TA*").search(test).group(0) #取出最右边的A至P的字符串,但不含有P if int(len(tag1))*tag2[0:-1]==tag3[1:]: #进行计算,中间“A”的数量×最左边“A”的数量=最右边“A”的数量 result.append('YES') else: result.append('NO') else: result.append('NO') i+=1for item in result: print(item)
2.C++
主要利用字符串的位置关系,通过遍历得到,较之正则表达式可能烦点。
#include <iostream>using namespace std;int main(){ int n; cin >>n; string s; int i,j; int tag1,tag2,tag3; for(i=0;i<n;i++){ cin>>s; j=0; while(s[j]=='A'){ j++; } if(s[j]=='P'){ tag1=j; //P所在位置,从0开始 j++; while(s[j]=='A'){ j++; } if(s[j]=='T'){ tag2=j; //T所在位置 } j++; while(s[j]=='A'){ j++; } tag3=j; //最右边A的位置 if(tag1*(tag2-tag1-1)==(tag3-1-tag2)&&(tag1+1)!=tag2){ //计算公式,但要注意一下去除中间A数量为0的情况 cout<<"YES"<<endl; } else{ cout <<"NO"<<endl; } } else{ cout <<"NO"<<endl; } }}
阅读全文
1 0
- 1003. 我要通过!
- 1003. 我要通过
- 1003. 我要通过!
- 1003. 我要通过!
- 1003.我要通过
- 1003. 我要通过!
- 1003. 我要通过
- 1003. 我要通过!
- 1003. 我要通过!
- 1003.我要通过
- 1003. 我要通过!
- 1003.我要通过
- 1003. 我要通过!
- 1003. 我要通过!
- 1003. 我要通过!
- 1003.我要通过!
- 1003.我要通过
- 1003. 我要通过
- Android下用NDK显式调用.so文件初探
- 网络层
- Excel VBA高效办公应用-第十一章-教师员工数据管理-Part1 (教师考核评测数据处理)
- 如何统计广告投放效果
- easyui之validatebox控件分析
- 1003. 我要通过!
- Python爬虫实战之抓取淘宝MM照片(二)
- POJ3620DFS
- js的内置对象
- java String 传递, 数组传递
- [leetCode刷题笔记]112. Path Sum
- 我的编程历程
- Excel VBA高效办公应用-第十一章-教师员工数据管理-Part2 (课表助手小程序)
- 1004. 成绩排名