P1040 有几个PAT

转跳点:🐏

1040 有几个PAT (25分)
 

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

现给定字符串,问一共可以形成多少个 PAT

输入格式:

输入只有一行,包含一个字符串,长度不超过1,只包含 PAT 三种字母。

输出格式:

在一行中输出给定字符串中包含多少个 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不易,诸君共勉!

posted @ 2020-01-24 21:58  秦_殇  阅读(213)  评论(0编辑  收藏  举报