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 ...
随机推荐
- ConcurrentHashMap源码解读二
接下来就讲解put里面的三个方法,分别是 1.数组初始化方法initTable() 2.线程协助扩容方法helpTransfer() 3.计数方法addCount() 首先是数组初始化,再将源码之前, ...
- 使用TK框架中updateByPrimaryKey与updateByPrimaryKeySelective区别
int updateByPrimaryKey(T var1); int updateByPrimaryKeySelective(T var1); updateByPrimaryKeySelective ...
- 序列化-JDK自带Serializable
如下代码示例:实现了Serializable接口(强制)的类,可以通过ObjectOutputStream的writeObject()方法转为字节流. 字节流通过ObjectInputStream的r ...
- Solon 的过滤器 Filter 和两种拦截器 Handler、 Interceptor
在web开发中,过滤器.拦截器是经常用到的功能.它可以帮我们限制流量.验证是否登陆.记录日志以及统计执行效率等等. 今天主要交流一下 Solon 框架中的过滤器和拦截器. Solon 是什么框架? S ...
- 【敏杰开发】Beta阶段事后分析
[敏杰开发]Beta阶段事后分析 设想和目标 Q 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们达到目标了么(原计划的功能做到了几个? 按照原计划交付时间交付 ...
- macos查看端口状况
Mac OS netstat命令与CentOS 略有出入 在Mac上正确使用的方法是:即-f需要加上地址族,-p需要加上协议TCP或者UDP等 如果需要查询inet:netstat -anvf ine ...
- IPMITool和其中常用的命令
IPMITool和其中常用的命令 # ipmitool -I lanplus -H 10.1.83.14-U ##### -P ##### chassis power status # ipmitoo ...
- ScreenToGif: 屏幕录制神器
ScreenToGif:一款小众但很好用的屏幕录制神器 牛人干货 2020-01-07 00:23:08 今天干货君给大家介绍一款电脑屏幕录制神器-ScreenToGif . ScreenToGif ...
- 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app -(转载)
第一步:先打开第一个hex文件, 第二步:选择 "Merge data file",合并文件 第三步:两个工程有可能地址相同,会有如下提示:(如果在编译的时候设置好Flash的地址 ...
- 5分钟安装docker教程
Centos安装docker需要操作系统是 CentOS 7 or 8,必须启用centos extras存储库.默认情况下,此存储库处于启用状态,但如果已禁用它,则需要重新启用它. 卸载旧版本 老版 ...