#include<bits/stdc++.h>
using namespace std;
int book[100000];
int main(){
string a;
cin>>a;
long long int sum=0;
/*for(int i=0;i<a.size();i++){
if(a[i]!='A') continue;
int countp=0,countt=0;
for( int j=0;j<i;j++){
if(a[j]=='P'){
countp++;
}
}
for(int j=i+1;j<a.size();j++){
if(a[j]=='T'){
countt++;
}
}
sum+=countt*countp;
}*/
int countp=0;
vector<int> cp;
for(int i=0;i<a.size();i++){
if(a[i]=='A') {
cp.push_back(countp);
}
if(a[i]=='P')
countp++;
}
//sebug
/* for(int i=0;i<cp.size();i++){
printf("%d",cp[i]);
}*/
int countt=0;
vector<int> ct;
for(int i=a.size()-1;i>=0;i--){
if(a[i]=='A') {
ct.push_back(countt);
}
if(a[i]=='T')
countt++;
}
//
/* for(int i=0;i<ct.size();i++){
printf("%d",ct[i]);
}*/
for(int i=0;i<cp.size();i++){
sum+=cp[i]*ct[cp.size()-1-i];
}
if(sum<=1000000007){
printf("%lld",sum);
}
else{
printf("%lld",sum%1000000007);
}
return 0;
}
总结
1.第一遍暴力解法超时,超时的原因是因为本来一遍for循环可以干更多的事情,我却只干了一件事而且把它们嵌套起来了,所以容易超时
所以除非不得不嵌套for,尽量不嵌套,提前在外面用不嵌套的for循环把信息准备好
2. moded by 用.......取余
3.本题有点类似于数带1数字个数的那个题 还有一个Google 的题 固定中间一位 看两边的组合有多少种
英语
问题
无