题目

计算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;
}
🌹💗正文结束💗🌹