点此处查看原题
dp[i][1]存前i个字符中有多少个"A";
dp[i][2]存前i个字符中有多少个"AC";
dp[i][3]存前i个字符中有多少个"ACM";
str[i]为'A'时:dp[i][1] = (dp[i - 1][1] + 1)
str[i]为'C'时:dp[i][2] = (dp[i - 1][1] + dp[i - 1][2])
str[i]为'M'时:dp[i][3] = (dp[i - 1][2] + dp[i - 1][3])
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int dp[maxn][4];
char str[maxn];
int main()
{
cin>>str + 1;
int n=strlen(str + 1);
for(int i=1;i <= n;i++)
{
dp[i][1]=dp[i-1][1];
dp[i][2]=dp[i-1][2];
dp[i][3]=dp[i-1][3];
if(str[i]=='A')
dp[i][1] = (dp[i - 1][1] + 1)% mod;
if(str[i]=='C')
dp[i][2] = (dp[i - 1][1] + dp[i - 1][2]) % mod;
if(str[i]=='M')
dp[i][3] = (dp[i - 1][2] + dp[i - 1][3]) % mod;
}
printf("%d\n",dp[n][3]);
return 0;
}