辅助数组记录左右的情况
这题和1101. Quick Sort一个思想
最后结果要取余数
long long 当然也不能忘
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long LL;
const int MAX = 100010;
int pnum[MAX] = {0}, tnum[MAX] = {0};
vector<int> indexa;
int main(){
string s;
cin>>s;
LL count = 0;
LL np = 0, na = 0, nt = 0;
//从左到右扫描s,记录每个A之前的P的数目,存入pnum[],并记录A的下标
for(int i = 0; i < s.size(); i++){
if(s[i] == 'P'){
np++;
}
pnum[i] = np;
if(s[i] == 'A'){
indexa.push_back(i);
}
}
//从右到左遍历记录每个A之后的T的数目,存入tnum[]
for(int i = s.size() - 1; i >= 0; i--){
if(s[i] == 'T'){
nt++;
}
tnum[i] = nt;
}
//每个A对应的PAT即为,A下标对应的pnum[indexa]*tnum[indexa]
for(int i = 0; i < indexa.size(); i++){
count += pnum[indexa[i]]*tnum[indexa[i]];
}
printf("%lld\n",count%1000000007);
return 0;
}