1040 有几个PAT (25分)

1040 有几个PAT (25分)_第1张图片

#include
#include
int main(){
     
    char s[100010];
    scanf("%s", s);
    int leftP[100010] = {
     0}, rightT = 0, ans = 0;
    for(int i = 0; i < strlen(s); i++){
     
        if(i > 0) leftP[i] = leftP[i - 1];
        if(s[i] == 'P') leftP[i]++;
    }
    for(int i = strlen(s) - 1; i >= 0; i--){
     
        if(s[i] == 'T') rightT++;
        else if(s[i] == 'A') ans = (ans + leftP[i] * rightT) % 1000000007;
    }
    printf("%d\n", ans);
    return 0;
}

除了strlen(s) 与下面代码一致,最后三个超时,应该是因为strlen(s)的时间复杂度为O(n),放在for(int i = 0; i < strlen(s); i++)里变成O(n^2)?

#include
#include
int main(){
     
    char s[100010];
    scanf("%s", s);
    int len = strlen(s);
    int leftP[100010] = {
     0}, rightT = 0, ans = 0;
    for(int i = 0; i < len; i++){
     
        if(i > 0) leftP[i] = leftP[i - 1];
        if(s[i] == 'P') leftP[i]++;
    }
    for(int i = len - 1; i >= 0; i--){
     
        if(s[i] == 'T') rightT++;
        else if(s[i] == 'A') ans = (ans + leftP[i] * rightT) % 1000000007;
    }
    printf("%d\n", ans);
    return 0;
}

满分

你可能感兴趣的:(1040 有几个PAT (25分))