PAT 乙级 1040 有几个PAT

437 阅读1分钟

题目概述

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

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

输入格式:

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

输出格式:

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

输入样例:

APPAPT
结尾无空行

输出样例:

2

思路解析

直接暴力会超时。 换个角度思考问题,对一个确定的A来说,以它形成的PAT的个数等于它左边P的个数乘以它右边T的个数。例如对字符串appapt的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT个数就是2*1=2.于是问题就转换成对字符串中的每个A,计算它左边的P的个数与它右边的T的个数的乘积,然后把所有A的这A这个乘积相加就是答案。

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin >> s;
    long P=0,A=0,T=0,leftT=0,PAT=0;//数据太大,用int会溢出
    for(char c:s)
        if(c=='T')
            T++;
    for(char c:s)
    {
        if(c=='P')
            P++;
        if(c=='T')
            leftT++;
        if(c=='A')
            PAT+=P*(T-leftT);
    }
    cout <<PAT%1000000007;
    return 0;
}

总结

感谢胡凡的《算法笔记》,没有这本书我根本就无法AC。
再接再厉,明天再刷一题