题目粗心:

给定一个只蕴含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考查取模,不能在最初统计实现后再取模,须要每计算一次就取模。

提交后果:

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;}