PAT_甲级_1093 Count PAT's

震耳欲聋
• 阅读 1052

题目大意:

给定一个只包含P,A,T的字符串,让其计算有多少个PAT组合

算法思路:

对一个确定位置的A来说,以它形成的PAT的个数等于它左边P的些个数乘以它右边T的个数。例如对字符申APPAPT的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT的个数就是2x1=2.于是问题就转换为:对字符串中的每个A,计算它左边P的个数与它右边T的个数的乘积,然后把所有A的这个乘积相加,最后的结果就是该字符串中所有的PAT组合数目。那么现在就是需要获取每一个位置的左边的P和右边的T的数,在这里我们使用leftPrightP分别保存当前位置左边的P和右边的T的个数。之所以可以这样保存,是因为当前位置i左边的P的个数和i-1位置左边P的个数具有继承性,要么相等,要么相差1。那么这样我们可以先遍历一遍所有的字符串中所有的T出现的个数,然后使用ans保存所有的PAT组合数目,再次遍历字符串的过程中,如果当前字符为P那么就让leftP加1,如果为T,就让rightT减一,如果为A,就累计leftP*rightT

注意点:

1、测试点3和4考察取模,不能在最后统计完成后再取模,需要每计算一次就取模。

提交结果:

PAT_甲级_1093 Count PAT's

AC代码:

#include <cstdio>
#include <string>
#include <iostream>

using namespace std;

int main(){
    string s;
    cin>>s;
    int len = s.size();
    int leftP = 0;
    int rightT = 0;
    int ans = 0;//记录PAT的个数
    for (int i = 0; i < len; ++i) {
        if(s[i]=='T'){
            ++rightT;
        }
    }
    for (int j = 0; j < len; ++j) {
        if(s[j]=='P'){
            ++leftP;
        } else if(s[j]=='T'){
            --rightT;
        } else if(s[j]=='A'){
            ans += leftP*rightT;
            ans %= 1000000007;
        }
    }
    cout<<ans;
    return 0;
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
BichonCode BichonCode
4年前
双指针问题
一、双指针之左右指针相关题目1.1题目要求:给定一个升序排列的整数数组,找到两个数,使它们的和等于给定的数,有且仅有一个满足条件的解,返回索引。题目分析:需要两个指针,一个指向开头,一个指向末尾,然后向中间遍历,如果指向的两个数相加正好等于target的话,直接返回两个指针的位置即可,若小于target,左指针右移一位,若大于target,右
Bill78 Bill78
4年前
Python 字符串常用方法总结
明确:对字符串的操作方法都不会改变原来字符串的值1,去掉空格和特殊符号name.strip()去掉空格和换行符name.strip('xx')去掉某个字符串name.lstrip()去掉左边的空格和换行符name.rstrip()去掉右边的空格和换行符2,字符串的搜索和替换name.count('x')查找某个
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Stella981 Stella981
3年前
C语言 快速排序 Quick Sort
算法描述:快速排序一般是选择数组的第一个数据为对称轴参考值pivot。按照大小数组分割成左右两个区间。然后对左右两个区间再进行递归排序,知道结束为止。例子演示:数组:43251,长度:5,对称轴参考值选择第一个数据4。比它小的我们放到它的右边,比它大的我们放到左边。设置左右两个工作位置。指向开头和末尾。第一轮:4325
Stella981 Stella981
3年前
Lua 学习记录
Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开赋值语句右边的值会依次赋给左边的变量a,b  1,2赋值语句会先计算右边所有的值然后再执行赋值操作x  1;y  2x, y  y, x变量个数\值的个数按变量个数补足nil变量个数<值的个数多余的值会被忽略a
Stella981 Stella981
3年前
CodeForces985F:Isomorphic Strings (字符串&hash)
题意:取出字符串Str里的两个串S,T,问对应位置的的字符在否有一一映射关系。hash:对于每个字符s‘a’‘z’,我们任意找一个i,满足Sis,(代码里用lower\_bound在区间找到最小的位置i)其对应的字符为Tit。然后我们判断这段区间里s的hash值是否等于t的hash值。不难证明26个字母都满足时对应hash相同时,才有
Stella981 Stella981
3年前
IntelliJ IDEA——数据库集成工具(Database)的使用
https://www.cnblogs.com/huiyi0521/p/10125537.html idea集成了一个数据库管理工具,可以可视化管理很多种类的数据库,意外的十分方便又好用。这里以oracle为例配置。1、配置在窗口的右边有个Database按钮,点击。!(https://oscimg.oschina.ne
菜园前端 菜园前端
2年前
什么是插入排序?
原文链接:什么是插入排序(insertionSort)?在数组中从左到右依次取一个数出来,然后把它放到合适的位置。从思想上可以分为有序区和无序区,有序区在左边代表已经排列好的元素。算法步骤1.默认左边第一个元素已经在有序区了2.在无序区取一个数出来(第二个