PAT乙级真题1040 || 有几个PAT(详解,C/C++示例,测试点分析)

个人主页:mzwang.top

有几个PAT

题目描述:

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

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

输入格式:

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

输出格式:

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

输入样例:

APPAPT

输出样例:

2

题目来源:PAT乙级1040
作者:CHEN, Yue
单位:浙江大学

问题解决:

解题思想

此题可按从前往后遍历或者从后往前遍历分下面两种解法:
方法一:从前往后遍历(代码1
从前往后遍历整个字符串,遇到字符P就统计其个数,遇到字符A就统计其之前所有的P的个数,遇到字符T就统计其之前所有的PA的个数,每次循环统计后判断总PAT的数量是否超过1000000007个,若超过则取对1000000007的余数,这样就不必将coun定义为long long型。
方法二:从后往前遍历(代码2
从后往遍历整个字符串,遇到字符T就统计其个数,遇到字符A就统计其之后所有的T的个数,遇到字符P就统计其之后所有的AT的个数。可见此法与方法一思想是一样的。

代码示例(C/C++)

小提示:请将以下代码保存为.cpp格式(C++程序)左右滑动代码以查看完整代码

代码1

//代码1,从前往后遍历
#include <cstdio>
using namespace std;
const int maxn = 100001;
int main()
{
    char str[maxn];
    scanf("%s",str);
    int coun = 0,coun_p = 0,coun_ap = 0;
    for(int i = 0; str[i] != '\0'; i++){
        switch(str[i])
        {
        case 'P':
            coun_p++;break; //A前面P的个数
        case 'A':
            coun_ap += coun_p;break;    //T前面所有的PA的个数
        default:    //T
            coun +=coun_ap; //该T对应的PAT的个数
        }
        if(coun > 1000000007){
            coun %= 1000000007;
        }
    }
    printf("%d",coun);
    return 0;
}

代码2

//代码2,从后往前遍历
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100001;
int main()
{
    char str[maxn];
    scanf("%s",str);
    int coun = 0,coun_T = 0,coun_AT = 0;
    int len = strlen(str);
    for(int i = len - 1; i >= 0; i--){
        switch(str[i])
        {
        case 'T':
            coun_T++;break; //A后面T的个数
        case 'A':
            coun_AT += coun_T;break;    //P后面所有的AT的个数
        default:    //P
            coun +=coun_AT; //该P对应的PAT的个数
        }
        if(coun > 1000000007){
            coun %= 1000000007;
        }
    }
    printf("%d",coun);
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值