PAT甲级 1093 Count PAT‘s (25 分) 状态机解法
题目
The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th characters.Now given any string, you are supposed to tell the number of PAT's contained in the string.
Input Specification
Each input file contains one test case. For each case, there is only one line giving a string of no more than \(10^5\) characters containing only P, A, or T.
Output Specification
For each test case, print in one line the number of PAT's contained in the string. Since the result may be a huge number, you only have to output the result moded by 1000000007.
Sample Input
APPAPT
Sample Output
2
限制
- 作者 CAO, Peng
- 单位 Google
- 代码长度限制 16 KB
- 时间限制 150 ms
- 内存限制 64 MB
题目大意
输入
由'P','A','T'三个字符组成的字符串
输出
字符串中包含"PAT"的个数。(PAT可以不连续,但要按这个顺序,只要有一个字符不一样,就可算一次。)
例子
APPAPT 包含2个"PAT"。分别是:APPAPT 和 APPAPT
题解
思路
用类似于编译原理中状态机的思路,:从左到右扫描字符串,对每个输入字符,都可以使字符串当前的状态变化。注:这不是标准意义上的状态机。
也就是设置了几个状态:start, P, PA, PAT(结束态)
- 当前字母是P时,P状态的个数加1;
- 当前字母是A时,所有P状态的字符串变为PA状态;
- 当前字母是T时,所有PA状态的字符串变为PAT状态。
扫描完字符串后,便可得出PAT状态的字符串有多少个。
代码
#include<bits/stdc++.h>
using namespace std;
#define MAX 1000000007
int main(){
string str;
cin >> str;
int p = 0, pa = 0, pat = 0;
int len = str.length();
for(int i = 0; i < len; i++){
switch(str[i]){
case 'P': p++;
p = p % MAX;
break;
case 'A': pa += p;
pa = pa % MAX;
break;
case 'T': pat += pa;
pat = pat % MAX;
break;
default: ;
}
}
cout << pat << endl;
return 0;
}
优点
- 编码直观,简单
- 可扩展性好,不但适用于三个字符的情况,更多字符的情况也适用。
扩展
题目
若题目变为4个字符的情况。如:输入是由'P','A','T','S'四个字符组成的字符串,输出是求字符串中包含"PATS"的个数。
思路
此时,状态机变成以下的情况:
在4个字符的情况下,设置了五个状态:start, P, PA, PAT,PATS(结束态)
- 当前字母是P时,P状态的个数加1;
- 当前字母是A时,所有P状态的字符串变为PA状态;
- 当前字母是T时,所有PA状态的字符串变为PAT状态;
- 当前字母是S时,所有PAT状态的字符串变为PATS状态。
扫描完字符串后,便可得出PATS状态的字符串有多少个。
代码
#include<bits/stdc++.h>
using namespace std;
#define MAX 1000000007
int main(){
string str;
cin >> str;
int p = 0, pa = 0, pat = 0,pats = 0; // 增加了 pats 状态
int len = str.length();
for(int i = 0; i < len; i++){
switch(str[i]){
case 'P': p++;
p = p % MAX;
break;
case 'A': pa += p;
pa = pa % MAX;
break;
case 'T': pat += pa;
pat = pat % MAX;
break;
case 'S': pats += pat; // 增加的代码
pats = pats % MAX; // 增加的代码
break; // 增加的代码
default: ;
}
}
cout << pats << endl; // 输出 pats 的个数
return 0;
}
PAT甲级 1093 Count PAT‘s (25 分) 状态机解法的更多相关文章
- PAT甲级——1093 Count PAT's (逻辑类型的题目)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/93389073 1093 Count PAT's (25 分) ...
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
- PAT 甲级 1083 List Grades (25 分)
1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...
- PAT甲级——1130 Infix Expression (25 分)
1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...
- PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)
1074 Reversing Linked List (25 分) Given a constant K and a singly linked list L, you are supposed ...
- PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习
1086 Tree Traversals Again (25分) An inorder binary tree traversal can be implemented in a non-recu ...
- PAT 甲级 1062 Talent and Virtue (25 分)(简单,结构体排序)
1062 Talent and Virtue (25 分) About 900 years ago, a Chinese philosopher Sima Guang wrote a histor ...
- PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)
1060 Are They Equal (25 分) If a machine can save only 3 significant digits, the float numbers 1230 ...
- PAT 甲级 1056 Mice and Rice (25 分) (队列,读不懂题,读懂了一遍过)
1056 Mice and Rice (25 分) Mice and Rice is the name of a programming contest in which each program ...
随机推荐
- Java解析xml文件遇到特殊符号&会出现异常的解决方案
文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...
- OAuth2.0 授权方式及步骤梳理总结
OAuth 2.0授权协议使第三方应用程序可以通过协调资源所有者和HTTP服务之间的批准交互,或者通过允许第三方应用程序代表资源所有者来获得对HTTP服务的有限访问权,或者代表资源所有者. 代表自己获 ...
- [bug] Scala eclipse:找不到或无法加载主类
原因 混合java 和scala 无法编译 解决 右键项目 > properties > scala Compiler >勾选Use Project Setting > Sca ...
- [刷题] 203 Remove Linked List Elements
要求 在链表中删除值为val的所有节点 示例 如 1->2->3->4->5->6->NULL,要求删除值为6的节点 返回1->2->3->4-& ...
- [Linux] Linux C编程一站式学习 Part.1
C语言入门 程序基本概念 程序和编程语言 C语言--(编译器)--汇编语言--(汇编器)--机器语言(目标代码 / 可执行代码) 可移植 / 平台无关:平台指计算机体系结构或操作系统,或二者的组合.不 ...
- GCC链接时库顺序问题
GCC或G++在编译链接时,如果命令行中含有库,则要特别注意了.根据<C专家编程>5.3节中的提示,GCC在链接时对命令行时的处理顺序是从左到右.证据是GCC的MAN: -l librar ...
- lambda,filter,map,reduce
# lambda,filter,map,reduce from functools import reduce print('返回一个迭代器') print((x) for x in range(5) ...
- Understanding User and Kernel Mode
https://blog.codinghorror.com/understanding-user-and-kernel-mode/ Continue Discussion92 repliesJan ' ...
- linux基础之权限管理
本节内容 1. 权限类别 属主(owner) 属组(group) 其他人(other) 2. 查看权限 ls -l 十位: 第一位文件类型-,d,l, 3. 设置权限 chmod 选项 权限模式 fi ...
- 10.1 ifconfig:配置或显示网络接口信息
ifconfig命令 用于配置网卡IP地址等网络参数或显示当前网络的接口状态,其类似于Windows下的ipconfig命令,这两个命令很容易混淆,读者需要区分一下.此外,ifconfig命令在配置网 ...