代码注释 很详细 :
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
char pat[100005];
int dp_p[100005],dp_a[100005],dp_t[100005];
int main()
{ // 思路 如下:
// A P P A P T
gets(pat); // dp_p 0 1 2 2 3 3 (有几个P)
int len=strlen(pat); // dp_a 0 0 0 2 2 2 (有几个PA)
if (pat[0]=='P') { // dp_t 0 0 0 0 0 2 (有几个PAT)
dp_p[0]=1; // 所以:
} // 若当前位置为P dp_p[i] = dp_p[i-1] + 1
else dp_p[0]=0; // 否则 dp_p[i] = dp_p[i-1]
//
for (int i=1;i<len;i++) { // 若当前位置为A dp_a[i] = dp_a[i-1] + dp_p[i-1]
if (pat[i]=='P') { // 否则 dp_a[i] = dp_a[i-1]
dp_p[i]=(dp_p[i-1]+1)%1000000007; //
} // 若当前位置为T dp_t[i] = dp_t[i-1] + dp_a[i-1]
else dp_p[i]=(dp_p[i-1])%1000000007; // 否则 dp_t[i] = dp_t[i-1]
}
dp_a[0]=0;
for (int i=1;i<len;i++) {
if (pat[i]=='A') {
dp_a[i]=(dp_a[i-1]+dp_p[i-1])%1000000007;
}
else dp_a[i]=(dp_a[i-1])%1000000007;
}
dp_t[0]=0;
for (int i=1;i<len;i++) {
if (pat[i]=='T') {
dp_t[i]=(dp_t[i-1]+dp_a[i-1])%1000000007;
}
else dp_t[i]=(dp_t[i-1])%1000000007;
}
cout<<dp_t[len-1];
return 0;
}