PAT 乙级 1040

题目

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

分析

前缀和 + 正倒序扫描 + 组合思想(A左边p的数量 * A右边T的数量 == 以该A为中心的pat数量)

AC代码

#include <iostream>

using namespace std;

typedef long long ll;

const int N = 100010;

int pp[N], pt[N];

int main ()
{
    string s;
    cin>>s;

    int sum_P = 0, mask = 0;
    for(int i = 0 ; i < s.size() ; i ++ )
    {
        if(s[i] == 'P') sum_P ++ ;
        if(s[i] == 'A') pp[ ++ mask] = sum_P;
    }

//cout<<mask<<endl;

    int sum_T = 0, mask1 = mask;
    for(int i = s.size() - 1 ; i ; i -- )
    {
        if(s[i] == 'T') sum_T ++ ;
        if(s[i] == 'A') pt[mask1 -- ] = sum_T;
    }

//for(int i = 1 ; i <= mask ; i ++ ) printf("%d %d\n", pp[i], pt[i]); 

    ll sum = 0;
    for(int i = 1 ; i <= mask ; i ++ )
    {
        sum += pp[i] * pt[i];
    }

    printf("%d", sum % 1000000007);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值