PTA(Basic Level)1040.有几个PAT

Posted martinlwx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA(Basic Level)1040.有几个PAT相关的知识,希望对你有一定的参考价值。

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

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

输入格式:

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

输出格式:

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

输入样例:
APPAPT
输出样例:
2
思路
  • 显然暴力搜索是会超时的,毕竟数量级是(10^5)
  • 目标字符串PAT才三个字符,可以转化为:数P的个数,数T的个数,考察每个A的位置,将PT的个数相乘就能得到结果,基本的排列组合的思想
代码
#include<bits/stdc++.h>
using namespace std;     //设当前位置为i,字符段长度为len
int lp[100010] = {0};   //区间[0,i]的P的个数
int rt[100010] = {0};   //区间[i,len-1]的T的个数
const int MOD = 1000000007;

int main()
{
    string pat;
    getline(cin, pat);
    for(int i=0;i<pat.size();i++)
        if(pat[i] == 'P')
            lp[i] = lp[i-1] + 1;
        else
            lp[i] = lp[i-1];        //数P
    for(int i=pat.size()-1;i>=0;i--)
        if(pat[i] == 'T')
            rt[i] = rt[i+1] + 1;
        else
            rt[i] = rt[i+1];        //数T
    int ans = 0;
    for(int i=0;i<pat.size();i++)
        if(pat[i] == 'A')
            ans = (ans + lp[i] * rt[i]) % MOD;    //在每个A的位置让两边的可能相乘就得到了经过当前位置A会有多少个PAT,累加起来就是答案
    cout << ans;
    return 0;
}
引用

https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616

以上是关于PTA(Basic Level)1040.有几个PAT的主要内容,如果未能解决你的问题,请参考以下文章

PTA乙级 (*1040 有几个PAT (25分))

1040 有几个PAT (25分)

PTA(Basic Level)1030.完美数列

*PTA(Basic Level) 1003

(Python) PAT(Basic Level) Practice 刷题笔记(34-66)

PTA(Basic Level)1029.旧键盘