PAT 乙级 1040( 有几个PAT )

PAT 乙级 1040

  • 题目要求
  • 代码
  • 思路

题目要求

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

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

输入格式:
输入只有一行,包含一个字符串,长度不超过10
​5
​​ ,只包含 P、A、T 三种字母。

输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

输入样例:
APPAPT

输出样例:
2

代码

#include
#include
#define S 1000000007;
using namespace std;
int main()
{
     
    unsigned int P=0,PA=0,PAT=0;
    char c;
    while((c=getchar())!='\n')
    {
     
        if(c=='P') P++;
        if(c=='A') PA = (PA+P)%S;
        if(c=='T') PAT = (PAT+PA)%S;
    }
    printf("%d",PAT);
    return 0;
}

思路

  • 每个A对应的PA组合数量是A之前P的数量
  • 每个T对应的PAT组合数量是T之前所有A对应的PA组合数量的累加
  • 所有的PAT组合数量是所有T对应的PAT组合数量的累加
    很神奇的理论,但是相当有道理,代码也和简洁。

你可能感兴趣的:(算法,c++)