PAT 乙级 1040 有几个PAT

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

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

输入格式:

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

输出格式:

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

输入样例:

APPAPT
 

输出样例:

2

总结:

/*
    本题的解法非常类似"在线处理"的思想.
    观察下面3段字符串:
    PA (只能组成1个PA)
    PAPA (第一个A能组成1个PA, 第2个A能组成2个PA(=该A前P的个数), 一共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几行搞定,  思想太重要了.
    注意取余数是在中间过程就取, 不用等到最后总数再取余.
*/

// #include <iostream>
#include <cstdio>

#define MOD 1000000007

// using namespace std;

const int maxn = 100010;

int main() {
    char str[maxn];
    while(~scanf("%s", str)) {
        long long p = 0, pa = 0, pat = 0;   //P PA PAT 的个数
        for(int i = 0; str[i]; ++i) {
            if(str[i] == 'P')
                ++p;
            if(str[i] == 'A')
                pa = (pa + p) % MOD;
            if(str[i] == 'T')
                pat = (pat + pa) % MOD;
        }
        printf("%lld\n", pat);
    }
    // system("pause");
    return 0;
}

 

参考:1040. 有几个PAT(25)

 

 

posted @ 2020-03-25 17:20  cralor  阅读(177)  评论(0编辑  收藏  举报