题目
思路
( ext{DP})
一个数组( ext{QAQ[4][101]})
( ext{QAQ[1][i]表示在i这个位置q的个数})
( ext{QAQ[2][i]表示在i这个位置qa的个数})
( ext{QAQ[3][i]表示在i这个位置能形成QAQ的个数})
对于第(i)个位置的(Q)
可以组成( ext{QAQ[2][i]})个(QAQ)
所以( ext{QAQ[3][i]+=QAQ[2][i]})
对于第(i)个位置的(A)
可以组成( ext{QAQ[1][i]})个(QA)
所以( ext{QAQ[2][i]+=QAQ[1][i]})
(Code)
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
string s;
int QAQ[4][101];
//QAQ[1][i]表示在i这个位置q的个数
//QAQ[2][i]表示在i这个位置qa的个数
//QAQ[3][i]表示在这个位置能形成QAQ的个数
inline int read(){
int x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}
int main(){
cin>>s;
int ns=s.length();
for(int i=0;i<ns;++i){
if(i!=0){
QAQ[1][i]=QAQ[1][i-1];
QAQ[2][i]=QAQ[2][i-1];
QAQ[3][i]=QAQ[3][i-1];
}
if(s[i]=='Q'){
QAQ[1][i]++;
QAQ[3][i]+=QAQ[2][i];
}
if(s[i]=='A'){
QAQ[2][i]+=QAQ[1][i];
}
}
cout<<QAQ[3][ns-1];
return 0;
}