原题: https://www.patest.cn/contests/pat-b-practise/1040

思路: 先给大家扔个测试PAPAATTPATTT, 人工查一下这段字符串能组成

34个PAT.

这一题我自己的想法非常的渣, 也非常复杂, 最后看了OliverLew大神的解答,

才明白这题原来是这样搞的. 本题的解法非常类似"在线处理"的思想.

观察下面3段字符串

  • PA (只能组成1个PA)
  • PAPA (第一个A能组成1个PA, 第2个A能组成2个PA, 一共1+2=3个PA)
  • PAPAPA (1 + 2 + 3 = 6个PA)

    现在我们看一下PAPAATTPATTT这个字符串, 我们不要一开始就盯着PAT这

    3个字符, 而是先看字符串里有多少P, 再看有多少PA, 最后确定有多少PAT.

    从左到右一个一个字符的看, 下面我给字符串标上号

    PAPAATTPAT T T

    0123456789 10 11
  • 走到下标0, P=1, PA=0, PAT=0
  • 走到下标1, P=1, PA=1, PAT=0
  • 走到下标2, P=2, PA=1, PAT=0
  • 走到下标3, P=2, PA=1+2=3, PAT=0
  • 走到下标4, P=2, PA=3+2=5, PAT=0
  • 走到下标5, P=2, PA=5, PAT=5
  • 走到下标6, P=2, PA=5, PAT=5+5=10
  • 走到下标7, P=3, PA=5, PAT=10
  • 走到下标8, P=3, PA=5+3=8, PAT=10
  • 走到下标9, P=3, PA=8, PAT=10+8=18
  • 走到下标10, P=3, PA=8, PAT=18+8=24
  • 走到下标0, P=3, PA=8, PAT=24+8=34

    相信大家已经看明白, 是的就这么简单, 寥寥10几行搞定, 我一开始自己搞了

    6个多小时, 代码一百多行, 还是不能全对, 思想太重要了.

注意取余数是在中间过程就取, 不用等到最后总数再取余.

完整实现:

#include <stdio.h>
#define MOD 1000000007
int main (void) {
long int p = 0;
long int pa = 0;
long int pat = 0;
char ch; while ((ch = getchar()) != '\n') {
if (ch == 'P') p++;
if (ch == 'A') pa = (pa + p) % MOD;
if (ch == 'T') pat = (pat + pa) % MOD;
}
printf("%ld", pat);
return 0;
}

参考资料:

OliverLew的简书: http://www.jianshu.com/p/65291de1906b

1040. 有几个PAT(25)的更多相关文章

  1. 1040 有几个PAT (25 分)

    题目:1040 有几个PAT (25 分) 思路: 是个规律题,只要找到规律就有思路,那代码基本就有了,就是怎么实现比较好和是否简洁的问题. 很明显:A是分水岭,A前面有多少个P和A后面有多少个T知道 ...

  2. PAT Basic 1040 有几个PAT (25 分)

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

  3. 1040 有几个PAT (25 分)C语言

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

  4. PAT 1040有几个PAT

    原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616 1040 有几个PAT (25 分) ...

  5. PAT(B) 1040 有几个PAT(Java)

    题目链接:1040 有几个PAT (25 point(s)) 题目描述 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 ...

  6. PAT乙级1040 有几个PAT

    题目: 1040 有几个PAT (25分)   字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位 ...

  7. PAT-乙级-1040. 有几个PAT(25)

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

  8. PAT (Basic Level) Practise (中文)-1040. 有几个PAT(25)

    1040. 有几个PAT(25)     http://www.patest.cn/contests/pat-b-practise/1040 字符串APPAPT中包含了两个单词“PAT”,其中第一个P ...

  9. 1040 有几个PAT (25 分)

    题目链接:1040 有几个PAT (25 分) 做这道题目,遇到了新的困难.解决之后有了新的收获,甚是欣喜! 刚开始我用三个vector数组存储P A T三个字符出现的位置,然后三层for循环,根据字 ...

  10. PAT-B 1040. 有几个PAT(25)

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

随机推荐

  1. 关于 MVVMLight 设计模式系列

    MVVM设计模式你可以在WPF.Silverlight.Windows Phone开发中使用,我想至今已经有非常非常多的朋友正在使用MVVM设计模式,尤其是MVVMLight . 本系列文章以WPF举 ...

  2. Python 入门(一)定义字符串+raw字符串与多行字符串

    定义字符串 前面我们讲解了什么是字符串.字符串可以用''或者""括起来表示. 如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" " ...

  3. /etc/sysctl.conf

    /etc/sysctl.conf 用于控制内核相关的配置参数,而且它的内容全部是对应于 /proc/sys/ 这个目录的子目录及文件 [root@localhost ~]$ ll /proc/sys ...

  4. Linux 虚拟终端:screen

    screen 是一个虚拟终端,我们可以把执行时间很长的命令放在虚拟终端中执行,即使终端断开,这个虚拟终端也会在后台执行 [root@localhost ~]$ yum install -y scree ...

  5. linux系统UDP的socket通信编程3

    我刚开始接触linux下的socket编程,边抄边理解udp socket编程,我的疑问是server不指定IP地址,client的目标IP地址是127.0.0.1,这样就可以通信吗?在同一主机下是不 ...

  6. IIC协议

    总线信号 :  SDA :串行数据线 SCL  :串行时钟 总线空闲状态 : SDA :高电平 SCL :高电平 起始位:SCL为高电平期间    SDA出现下降沿 终止位:SCL为高电平期间 SDA ...

  7. cocos2d-x游戏引擎核心之一——坐标系

    cocos2d-x:OpenGL坐标系.绝对坐标系.相对坐标系.屏幕坐标系 cocos2d-x采用的是笛卡尔平面坐标系,也就是平面上两条垂直线构成的坐标系,平面上任意一点都可以用(x,y)来表示. ( ...

  8. 好用的在线Markdown编辑器

    dillinger.io 支持在线编辑,导出为html格式等.

  9. ubuntu 备忘

    卷组扩容 Linux mint采用默认卷组的安装方式 sain@Linux ~ $ df -hl Filesystem Size Used Avail Use% Mounted on udev .7G ...

  10. Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中

    有两张表, 一张为爱好表b表 一张为用户表 u表 u表 id   名称   爱好Id 1    张三     1,2,3,4 2    李四      2,5 b表 id  名称 1    打乒乓 2 ...