PAT (Advanced Level) 1093. Count PAT's (25)
预处理每个位置之前有多少个P,每个位置之后有多少个T。
对于每个A,贡献的答案是这个A之前的P个数*这个A之后T个数。
#include<cstdio> #include<cstring> long long MOD=1e9+7; const int maxn=1e5+10; long long dp1[maxn],dp2[maxn]; char s[maxn]; int main() { scanf("%s",s); memset(dp1,0,sizeof dp1); if(s[0]=='P') dp1[0]=1; for(int i=1;s[i];i++) { dp1[i]=dp1[i-1]; if(s[i]=='P') dp1[i]++; } memset(dp2,0,sizeof dp2); int len=strlen(s); if(s[len-1]=='T') dp2[len-1]=1; for(int i=len-2;i>=0;i--) { dp2[i]=dp2[i+1]; if(s[i]=='T') dp2[i]++; } long long ans=0; for(int i=1;s[i];i++) { if(s[i]=='A') ans=(ans+dp1[i-1]*dp2[i+1])%MOD; } printf("%lld\n",ans); return 0; }