原题: 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

转载于:https://www.cnblogs.com/asheng2016/p/7823184.html

1040. 有几个PAT(25)相关推荐

  1. C++学习之路 | PTA乙级—— 1040 有几个PAT (25 分)(精简)

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

  2. 1040 有几个PAT (25 分)

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

  3. 1040 有几个PAT (25 分) -- 测试点3 测试点4

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

  4. PAT 乙级 1040 有几个PAT (25分)

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

  5. 1040 有几个PAT (25 分)

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

  6. 【PAT】乙级 1040 有几个PAT (25 分) c++

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

  7. 1040 有几个PAT (25分)——18行代码AC

    立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 P ...

  8. 1040 有几个PAT (25分)

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

  9. 【PAT乙级】1040 有几个PAT (25 分)

    题目地址 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; const int mod=1e9+7; int ...

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

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

最新文章

  1. Ubuntu 14.04 64bit上安装Scrapy
  2. springmvc跨域(转)
  3. 快评 美国软件开发杂志的最新jolt大奖!
  4. NLP 笔记: 序列标注与BIO标注
  5. 卡萨帝:用发明去超越历史!15年走完百年路
  6. packt_Packt发行的$ 5 Java编程书籍:精通Java 9,Java 9高性能
  7. Http请求处理流程
  8. mysql8修改密码
  9. 微软power bi_Microsoft Power Platform快速概述
  10. powerbi输入数据_与内部共享 Power BI 仪表板和报表
  11. OPenDDS程序 的 实现+运行
  12. 微信小程序点击图片放大
  13. 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论...
  14. 【转载】mac读取ntfs硬盘方法
  15. selected和checked区别
  16. 快递100商家下单demo
  17. 停止线程 暂停线程
  18. 群晖docker部署带web容器的端口配置
  19. 软工尾声-提问回顾与个人总结
  20. 新手上路,请多关照!

热门文章

  1. RabbitMQ教程_4 Java 使用rabbitmq
  2. php随机生成验证图片,php 生成随机验证码图片代码
  3. Golang 网络爬虫框架gocolly/colly
  4. BZOJ2820:YY的GCD
  5. linux下apache+php配置
  6. django/python日志logging 的配置以及处理
  7. 用CentOS 6快速配置一台企业级Web代理服务器
  8. 存储空间的动态分配与释放
  9. throw和throws有什么区别
  10. python笔记:#010#运算符