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

原文地址:https://www.cnblogs.com/MartinLwx/p/12438828.html

时间: 2024-10-08 20:20:01

PTA(Basic Level)1040.有几个PAT的相关文章

来自PTA Basic Level的三只小野兽

点我阅读原文 最近利用闲暇时间做了一下 PTA Basic Level[1] 里的题,里面现在一共有 95 道题,这些题大部分很基础,对于刷倦了 leetcode 的小伙伴可以去里面愉快的玩耍哦. 这里我挑了三个挺有意思的题来做个简单记录,欢迎和大家一起讨论交流. 请听题: 第一题:1009 说反话 题目描述 给定一个英语句子,各个单词之间用空格分隔.要求你编写程序,将句中所有单词的顺序颠倒输出. 输入示例 Hello World Here I Come 输出示例 Come I Here Wor

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

1040 有几个PAT (25分) https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616 #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> typedef lo

PTA(Basic Level)1057.数零壹

给定一串长度不超过 105 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0.多少 1.例如给定字符串 PAT (Basic),其字母序号之和为:16+1+20+2+1+19+9+3=71,而 71 的二进制是 1000111,即有 3 个 0.4 个 1. 输入格式: 输入在一行中给出长度不超过 105.以回车结束的字符串. 输出格式: 在一行中先后输出 0 的个数和 1 的个数,其间以

PTA(Basic Level)1012.数字分类

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1?n2+n3?n4?: A3 = 被 5 除后余 2 的数字的个数: A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位: A5 = 被 5 除后余 4 的数字中最大数字. 输入格式: 每个输入包含 1 个测试用例.每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过

PTA(Basic Level)1016.部分A+B

正整数 A 的"*D**A(为 1 位整数)部分"定义为由 A* 中所有 *D**A* 组成的新整数 PA.例如:给定 A=3862767,DA=6,则 A 的"6 部分"*P**A* 是 66,因为 A 中有 2 个 6. 现给定 A.DA.B.DB,请编写程序计算 PA+PB. 输入格式: 输入在一行中依次给出 A.DA.B.DB,中间以空格分隔,其中 0<A,B<1010. 输出格式: 在一行中输出 PA+PB 的值. 输入样例 1: 386276

PTA(Basic Level)1029.旧键盘

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及实际被输入的文字.每段文字是不超过 80 个字符的串,由字母 A-Z(包括大.小写).数字 0-9.以及下划线 _(代表空格)组成.题目保证 2 个字符串均非空. 输出格式: 按照发现顺序,在一行中输出坏掉的键.其中英文字母只输出大写,每个坏键只输出一次.题目保证至少有 1 个坏键. 输入样例: 7

PTA(Basic Level)1027.打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指每行输出奇数个符号:各行符号中心对齐:相邻两行符号数差2:符号数先从大到小顺序递减到1,再从小到大顺序递增:首尾符号数相等. 给定任意N个符号,不一定能正好组成一个沙漏.要求打印出的沙漏能用掉尽可能多的符号. 输入格式: 输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔. 输出格式: 首先打印出

PTA(Basic Level)1087.有多少不同的值

当自然数 n 依次取 1.2.3.--.N 时,算式 ?n/2?+?n/3?+?n/5? 有多少个不同的值?(注:?x? 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: 输入给出一个正整数 N(2≤N≤104). 输出格式: 在一行中输出题面中算式取到的不同值的个数. 输入样例: 2017 输出样例: 1480 思路 充分说明了STL的重要性,掌握了它代码量就少了好多- 代码 #include<bits/stdc++.h> using namespace std;

PTA(Basic Level)1077.互评成绩计算

在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平均分记为 G1:老师给这个组的评分记为 G2.该组得分为 (G1+G2)/2,最后结果四舍五入后保留整数分.本题就要求你写个程序帮助老师计算每个组的互评成绩. 输入格式: 输入第一行给出两个正整数 N(> 3)和 M,分别是分组数和满分,均不超过 100.随后 N 行,每行给出该组得到的 N 个分数