1040 有几个PAT (25分)

题目

字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

现给定字符串,问一共可以形成多少个 PAT

输入格式

输入只有一行,包含一个字符串,长度不超过10^5,只包含 PAT 三种字母。

输出格式

在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

输入样例:

APPAPT

输出样例:

2

解析

  首先规律呢,是在A上,每遇到一个A,那么A前P数 * A后T数就是总数,每遇到一个A就累加一下,然后出结果啦👌
  那么只要保存一下每个A前后的P、T数就可以了
  我这里呢用数组保存每一个A位置前的P数和每一个A位置后的T数,分别正反遍历一次字符串,i位置前P的数量等于i-1位置前P的数量,同样T数量同理,最后每个位置乘起来就好了👌
  说的好像蛮简单的,路子都在那里,这里推荐下面那个代码,搬运别人的,值得学习,真好!

答案

#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
int P[100001],T[100001];

int main(){
    string s;
 
    int num = 0,i,j = 1,k = 1,sum = 0,a;
    cin>>s;
    int len = s.length();
    for(i = 0; i < len ; i++){
        if(s[i] == 'P'){
            P[j] ++;
        }else if(s[i] == 'A'){
            j ++;
            P[j] += P[j - 1];
        }
    }
    for(i = len-1; i >= 0; i--){
        if(s[i] == 'T'){
            T[k] ++;
        }else if(s[i] == 'A'){
            k ++;
            T[k] += T[k - 1];
        }
    }
    j = 1;
    while((a = s.find('A')) != -1){
        sum += (P[j++] * T[--k]);
        sum %= 1000000007;
        s[a] = 'B';
    }
    printf("%d\n",sum%1000000007 );
}

别人家的代码

先遍历字符串数一数有多少个T然后每遇到一个T呢countt–;每遇到一个P呢,countp++;然后一遇到字母A呢就countt * countp,把这个结果累加到result中,最后输出结果就好啦~~

#include<iostream>
#include <string>
using namespace std;
int main() {
    string s;
    cin >> s;
    int len = s.length(), result = 0, countp = 0, countt = 0;
    for (int i = 0; i < len; i++) {
        if (s[i] == 'T')
            countt++;
    }
    for (int i = 0; i < len; i++) {
        if (s[i] == 'P') countp++;
        if (s[i] == 'T') countt--;
        if (s[i] == 'A') result = (result + (countp * countt) % 1000000007) % 1000000007;
    }
    cout << result;
    return 0;
}
posted @ 2020-08-05 15:24  小马小马最可爱  阅读(125)  评论(0)    收藏  举报