转跳点:🐏
1040 有几个PAT (25分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过1,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
这道题,和之前的我要通过一样属于,烧脑题,代码极简。我可怜的头发。
(在写分析之前先写一下规定,P的个数:Pcount;PA的个数:PAcounT,PAT的个数:PATcount,)
我第一轮分析如下:
随便写了一个样例,写出了所有可能,得出一些结论:
1、发现PAT的个数取决于PA个数
2、PA个数取决于P个数
第二次分析:
统计了一下每个A前面P的 Pcount,发现每个A对应的 PAcount 是 A 之前的Pcount的数量
统计了一下每个T前面的PA的 PAcount,发现每个T对应的PATcount是T之前所有A对应的PAcount的累加
最后统计了一下PTAcount并和每个T前面的PA的 PAcount对比了一下,发现字符串里所有的PATcount是所有T对应的PTAcount的累加
到此就可以得出无比简单的代码了
AC代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define LIMT 1000000007
4
5 int main(void)
6 {
7 char ch;
8 int P = 0, PA = 0, PAT = 0;
9
10 while ((ch = getchar()) != '\n')
11 {
12 if ('P' == ch)
13 {
14 P++;
15 continue;
16 }
17 if ('A' == ch)
18 {
19 PA = (PA + P) % LIMT;
20 continue;
21 }
22 PAT = (PAT + PA) % LIMT;
23 }
24
25 printf("%d", PAT);
26 return 0;
27 }
PS:如果对每次都遇到取余问题都会对这个magic number——1000000007取模感兴趣的话,戳这里≖‿≖✧
PTA不易,诸君共勉!
来源:https://www.cnblogs.com/daker-code/p/12232228.html