一、题目描述
Input Specification:
Output Specification:
Sample Input:
APPAPT
Sample Output:
2
二、解题思路
经过简单的逻辑推理,我们可以知道,对于某一个确定的’A’,它能形成的’PAT’的数目为:这个’A’前面’P’的个数与这个’A’后面’T’的个数的乘积,我们就可以用两个数组来记录每个位置之前’P’的数目和之后’T’的数目,最后遍历一遍,遇到’A’我们就把它能形成的’PAT’的数目加到结果上面去,最后输出即可。
三、AC代码
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int maxn = 100010;
int cntP[maxn] = {0}, cntT[maxn] = {0};
int main()
{
string str;
long long sum = 0;
cin >> str;
int sze = str.size();
for(int i=0; i<sze; i++)
{
if(str[i] == 'P')
{
if(i==0) cntP[i] = 1;
else cntP[i] = cntP[i-1] + 1;
}
else
if(i>0) cntP[i] = cntP[i-1];
}
for(int i=sze-1; i>=0; i--)
{
if(str[i] == 'T')
{
if(i==sze-1) cntT[i] = 1;
else cntT[i] = cntT[i+1]+1;
}
else
if(i<sze-1) cntT[i] = cntT[i+1];
}
for(int i=0; i<sze; i++)
{
if(str[i] == 'A')
sum += cntT[i] * cntP[i];
}
sum %= 1000000007;
printf("%d", sum);
return 0;
}