首页 > 其他 > 详细

PAT 乙级 1040 有几个PAT

时间:2020-03-25 18:00:05      阅读:59      评论:0      收藏:0      [点我收藏+]

字符串 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)

 

技术分享图片

 

PAT 乙级 1040 有几个PAT

原文:https://www.cnblogs.com/cralor/p/12567477.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!