1093 Count PAT

题目

计算PAT的子串,只要前后顺序对了就算试子串.

思路

一开始我是这样想的,只要按照顺序PAT的顺序数出P的数量,A的数量,T的数量然后相乘就可以了,这种思路只对字符串t后面没有pat子串时有效,说白了就是还有一些情况没有考虑到

分析:要想知道构成多少个PAT,那么遍历字符串后对于每一A,它前面的P的个数和它后面的T的个数的乘积就是能构成的PAT的个数。然后把对于每一个A的结果相加即可~辣么就简单啦,只需要先遍历字符串数一数有多少个T~然后每遇到一个T呢~countt–;每遇到一个P呢,countp++;然后一遇到字母A呢就countt * countp~~把这个结果累加到result中~~最后输出结果就好啦~对了别忘记要对10000000007取余哦~~

为什么要对1000000007取模

代码中为什么p的数量要加而t的数量要减了,这是因为t的总数量已经计算出来了,总数减去a前面的就能知道后面的T(很机智唉!!!)

代码

#include <iostream>

using namespace std;

int main() {
    string s;
    cin>>s;
    int pc = 0,tc = 0;
    int res = 0;
    for(int i=0; i<s.size(); i++) {
        if(s[i]=='T') {
            tc++;
        }
    }
    for(int i=0; i<s.size(); i++) {
        if(s[i]=='P') {
            pc++;
        } else if(s[i]=='T') {
            tc--;
        } else if(s[i]=='A') {
            res = (res+(pc*tc)%1000000007)%1000000007;
        }
    }
    cout<<res;
    return 0;
}
??正文结束??
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值