思路:找一个A前面一个字符之前的Q与后一个字符之后的Q,两个个数的乘积是用到了这个位置A的子序列的个数。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int cnt1[5009] = {0}; //存放第i-1个字符之前有多少Q
int cnt2[5009] = {0}; //存放i+1之后有多少Q
int main()
{
char str[5009];
cin>>str;
int i = 0;
for(; str[i]!='\0';i++)
{
if(str[i]=='Q')
{
cnt1[i+1] = cnt1[i]+1;
}
else
{
cnt1[i+1] = cnt1[i];
}
}
for(i--; i>=0;i--)
{
if(str[i]=='Q')
{
cnt2[i-1] = cnt2[i]+1;
}
else
{
cnt2[i-1] = cnt2[i];
}
}
long long ans= 0;
for(int j =2 ;str[j]!='\0';j++)
{
if(str[j]=='A')
ans = ans + cnt1[j-1]*cnt2[j+1];
}
cout<<ans;
}