树状数组维护"桶数组"
统计某一个位置之前'P'的个数
统计某一个位置之后'T'的个数
树状数组可以用来高速求前缀和
对于单点修改和区间查询
时间复杂度为 log n
#include<iostream>
#include<string>
using namespace std;
const int N=1e5+10;
int cntP[N];
int cntT[N];
long long ans;
int n;
int lowbit(int x)
{
return x&(-x);
}
void add(int pos,int val,int* array)
{
for(int i=pos;i<=n;i+=lowbit(i))array[i]+=val;
}
int quiry(int pos,int* array)
{
int sum=0;
for(int i=pos;i>=1;i-=lowbit(i))sum+=array[i];
return sum;
}
int main()
{
string str;
cin>>str;
n=str.size()+1;
for(int i=0;i<n;i++)
{
int pos=i+1;
if(str[i]=='P')add(pos,1,cntP);
if(str[i]=='T')add(pos,1,cntT);
}
for(int i=0;i<n;i++)
{
int pos=i+1;
if(str[i]=='A')
ans+=quiry(pos-1,cntP)*(quiry(n,cntT)-quiry(pos,cntT))%1000000007;
ans%=1000000007;
}
cout<<ans;
return 0;
}