题目链接
《算法笔记》上面的思路很巧妙,一开始并没有想到,用了另外一种思路,稍微复杂点,但是时间性能和空间性能都比书上的参考代码好一点。
书上的参考代码:
#include <cstdio>
#include <cstring>
int leftNumberP[100010]={0};
int rightNumberT[100010]={0};
char str[100010];
int main(void){
scanf("%s",str);
int len=strlen(str);//
if (str[0]=='P') leftNumberP[0]=1;
for (int i=1; i<len; i++){
if (str[i]=='P'){
leftNumberP[i]=leftNumberP[i-1]+1;
}else{
leftNumberP[i]=leftNumberP[i-1];
}
}
if (str[len-1]=='T') rightNumberT[len-1]=1;
for (int i=len-2; i>=0; i--){
if (str[i]=='T'){
rightNumberT[i]=rightNumberT[i+1]+1;
}else{
rightNumberT[i]=rightNumberT[i+1];
}
}
int ans=0;
for (int i=0; i<len; i++){
if (str[i]=='A'){
ans=(ans+leftNumberP[i]*rightNumberT[i])%1000000007;
}
}
printf("%d",ans);
}
我的思路没参考代码巧妙,但也不算很难:
#include <cstdio>
#include <cstring>
char str[100010];
int PBeforeA[100010]={0}, TAfterA[100010]={0};
int main(){
scanf("%s",str);
int count=0;
int len=strlen(str);
int posA=-1;
for (int i=0; i<len; i++){
if (str[i]=='A'){
if (count){
PBeforeA[count]=PBeforeA[count-1];
TAfterA[count]=TAfterA[count-1];
for (int j=posA+1; j<i; j++){
if (str[j]=='P'){
PBeforeA[count]++;
}
if (str[j]=='T'){
TAfterA[count]--;
}
}
}else {
for (int j=0; j<i; j++){
if (str[j]=='P'){
PBeforeA[count]++;
}
}
for (int j=i+1; j<len; j++){
if (str[j]=='T'){
TAfterA[count]++;
}
}
}
count++;
posA=i;
}
}
long long ans=0;
for (int i=0; i<count; i++){
ans=(PBeforeA[i]*TAfterA[i]+ans)%1000000007;
}
printf("%d",ans);
}
我一开始是暴力求解,后面三个数据通过不了,后来想办法降低复杂度,不算难。