首页 > 试题广场 >

有几个PAT(25)

[编程题]有几个PAT(25)
  • 热度指数:14938 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)。

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

输入描述:
输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。


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

输入

APPAPT

输出

2
#include<cstdio>
#include<cstring>
const int MAXN = 100010;
const int MOD = 1000000007;
char str[MAXN];
int numLeftP[MAXN] = { 0 };
int main(){
	gets(str);
	int len = strlen(str);
	for (int i = 0; i < len; i++){
		if (i>0)
			numLeftP[i] = numLeftP[i - 1];
		if (str[i] == 'P')
			numLeftP[i] += 1;
	}
	int ans = 0, numRightT=0;
	for (int i = len - 1; i >= 0; i--){
		if (str[i] == 'T')
			numRightT++;
		else if (str[i] == 'A')
			ans = (ans + numLeftP[i] * numRightT) % MOD;
	}
	printf("%d\n", ans);
	return 0;
}
解题思路
分析 题目中PAT的总数是每一位A前的P的数量与A后的T的数量相乘
1.先从左向右遍历每一位A前的P的个数,保存在数组里
2.再从右向左遍历T的个数,每遇到一个A就将A的数量与T的数量相乘,得到当前A对应PAT 的数量,并加到总数中
发表于 2017-06-04 15:42:51 回复(1)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String orgStr = "";
        while (in.hasNext()) {
            orgStr = in.nextLine();
        }
        char[] arr = orgStr.toCharArray();
        int pNum = 0;
        int paNum = 0;
        int patNum = 0;
        for(char val : arr){
            if((""+val).equals("P")){
                pNum++;
            }else if((""+val).equals("A")){
                paNum +=pNum;
                paNum = paNum%1000000007;
            }else {
                patNum +=paNum;
                patNum = patNum%1000000007;
            }
        }
        System.out.println(patNum);
    }
}
发表于 2015-05-28 17:18:50 回复(2)
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
usingnamespacestd;
 
intmain()
{
    charc;
    intnum=0,p=0,t=0;
    while(1)
    {
        c=getchar();
       switch(c)
        {
        case'P':  p++; break;
        case'A':  t+=p; t=t%1000000007;break;
        case'T': num+=t; num=num%1000000007;break;
        case10:break;
        default:break;
        }
       if(c==10||c==' ')
            break;
    }
 
    cout<<num;
    return0;
}
//下一个A前面有多少个P,下一个T前面有多少个PA。
发表于 2017-12-09 16:29:10 回复(0)
#include <cstdio>
int main() {
    for(int c, p = 0, pa = 0, pat = 0; ((c = getchar()) != '\n' ? (c == 'P'? ++p : (c == 'A' ? (1 + (pa = (pa + p) % 1000000007)) : (1 + (pat = (pat + pa) % 1000000007)))) : (~printf("%d\n", pat))) > 0;);
    return 0;
}

发表于 2021-10-12 10:58:28 回复(0)
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String text = in.nextLine();
        int pcount = 0;
        int pacount= 0;
        int totalcount = 0;
        for (int i=0;i<text.length();i++){
             char c = text.charAt(i);
            if (c == 'P') {
                pcount++;
            } else if (c == 'A') {
                pacount+=pcount;
            }else {
                totalcount+=pacount;
                totalcount %= 1000000007;
            }
        }
        System.out.println(totalcount);
    }
}






发表于 2020-07-26 21:01:06 回复(0)

分析

  • 暴力破解是不可能暴力的,这辈子都不会暴力的。还是分析下他的数学规律吧。

  • 首先,应该看到它的有序性,PAT字符串是按顺序的,有点动态规划的意思,也就是,没遇到A前,P个数是被统计的,A以后的P是遇到下一个A才会被统计。考虑APAPAT返回应该是3。所以有每次遇到A前,统计P个数;遇到A时,应统计PA个数,也就是之前的PA和当前组成PA的个数;遇到T时,应统计PAT个数,也就是之前的PAT和当前PAT个数。

/*
 * app=PAT-Basic lang=c++
 * https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616
 */
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 100010;
char ch[maxn];
int main()
{
    scanf("%s",ch);
    int len = strlen(ch);
    int res = 0, P = 0, PA = 0;
    for (int i = 0; i < len; i++){
        if (ch[i] == 'P') P++;
        if (ch[i] == 'A') PA = (PA + P) % 1000000007;//这里很巧妙地解决了PA的顺序出现。要慢慢理解
        if (ch[i] == 'T') res = (res + PA) % 1000000007;//这里很巧妙地解决了PAT的顺序出现。
    }
    printf("%d",res);
    return 0;
}
发表于 2019-12-03 15:44:44 回复(0)
小觑天下英雄了!
灵光一现想到这种方法,正自鸣得意,评论区一看,大家都是用的这类似的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PatNum
{
    class Pat
    {
        static void Main(String[] argu)
        {
            String s = Console.ReadLine();
            int p = 0, pa = 0, pat = 0;
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] == 'P')
                {
                    p++;
                }
                if (s[i] == 'A')
                {
                    pa += p;
                }
                if (s[i] == 'T')
                {
                    pat += pa;
                }
                pat = pat % 1000000007;
            }
            Console.WriteLine(pat);
            Console.ReadKey();
        }
    }
}

发表于 2019-10-03 14:51:35 回复(0)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100010;
int main()
{
    string str;
    cin>>str;
    int len=str.length() ;
    int p[maxn]={0};
    for(int i=0;i<len;++i)
    {
        if(i>0){
            p[i]=p[i-1];
        }
        if(str[i]=='P'){
            p[i]++;
        }
    }
    int ans=0,t=0;
    for(int i=len-1;i>=0;--i)
    {
        if(str[i]=='T'){
            t++;
        }
        else if(str[i]=='A')
        {
            ans=(ans+(p[i]*t))%1000000007;
        }
    }
    printf("%d\n",ans);
    return 0;
}
发表于 2019-04-18 15:53:09 回复(0)
//我是从后往前遍历的。(跟玩游戏一样)
//把"T"当作怪物,见一次打死一次。
//把"A"当作存档点,每次存一下。
//最后遇到"P"的时候,把任务(怪物)交了。。。
//#include "stdafx.h"
#include <cstdio>
#include <cstring>
const int Max = 100010;
char s[Max];
int a[Max] = {0};
int main(){
    scanf("%s", s);
    int n = strlen(s);
    int ans = 0;
    int ai = 0, ti = 0, pi = 0;
    for(int k = n - 1; k >= 0; --k){
        if(s[k] == 'T')ti++;
        else if(s[k] == 'A'){ai++; a[ai] = a[ai-1] + ti; }
        else ans = (ans + a[ai]) % 1000000007;
    }
    printf("%d\n", ans);
}

发表于 2018-07-31 14:43:50 回复(1)
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
int main()
{
    string str;
    cin >> str;
    vector<long long> vA,vP;
    long long cntA = 0,cntP = 0,sum = 0;
    for(int i = str.size();i >=0;i--){
        if(str[i] == 'A')    vA.push_back(cntA),cntP++;
        else if (str[i] == 'P')    vP.push_back(cntP);
        else if(str[i] == 'T')    cntA++;
    }
    for(int i = 0;i < vP.size() ;i++)
        for(int j = 0;j < vP[i];j++)
            sum+=vA[j];
    cout << sum%1000000007 <<endl;
}
发表于 2018-03-11 15:10:30 回复(0)
js版本的,一次遍历
var readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.on('line', function(line) {
    var res = 0;
    var p = 0;
    var t = line.length - line.replace(/T/g, '').length;
    for (var i = 0; i < line.length; i++) {
        switch (line[i]) {
            case "P":
                p++;
                break;
            case "A":
                res = (res + p * t) % 1000000007;
                break;
            case "T":
                t--;
                break;
        }
    }
    console.log(res);
});

发表于 2017-09-28 10:25:46 回复(0)
importjava.util.Scanner;
 
publicclassMain {
 
    publicstaticvoidmain(String[] args) {
        Scanner in =newScanner(System.in);
        char[] chs = in.nextLine().toCharArray();
        int[] pat =newint[chs.length];
        for(inti =0; i < chs.length; i++){
            pat[i] = -1;
        }
        intcount =0;
        intp =0;
        intt =0;
        inta =0;
        for(inti =0; i < chs.length; i++) {
            if(chs[i] =='P')
                p++;
            if(chs[i] =='A') {
                pat[a] = p;
                a++;
            }
        }
        a--;
        for(inti = chs.length -1; i >=0; i--) {
            if(chs[i] =='T')
                t++;
            if(chs[i] =='A') {
                count+= pat[a]*t;
                if(count>1000000007) count = count%1000000007;
                a--;
            }
        }
         
        System.out.print(count);
    }
 
}

发表于 2016-09-21 17:27:24 回复(0)
//答案参考的那个“啥”的代码,真大神,膜拜了。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    long pCount = 0, paCount = 0, patCount = 0;
    char letter;
    scanf("%c", &letter);
    while(letter != '\n' && letter != ' ')
    {
        if(letter == 'P')
            pCount++;
        else if(letter == 'A')
            paCount += pCount;
        else
            patCount += paCount;
        scanf("%c", &letter);
    }
    cout << patCount % 1000000007;
    return 0;
} 

发表于 2016-08-20 14:42:08 回复(0)
//这道题的关键是将PAT分为三个类
//从前往后  统计P的数量
//每一个A对应所有的P  那么每次遇到一个A PA的数量就加上P的数量
//每一个T对应所有的PA  那么每一个T  就加PA  
最后输出PAT
import java.util.Scanner;


public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String A = sc.next();
long p_count = 0;
long pa_count = 0;
long pat_count = 0;
for(int i=0;i<A.length();++i){
if(A.charAt(i)=='P'){
p_count++;
}else if(A.charAt(i)=='A'){
pa_count += p_count;
pa_count = pa_count%1000000007;
}else if(A.charAt(i)=='T'){
pat_count += pa_count%1000000007;
pat_count = pat_count%1000000007;
}
}
System.out.println(pat_count);
}
}
发表于 2015-10-26 14:49:25 回复(0)
啥头像
总体思路:
   统计pat需要pa的数量,统计pa需要p的数量,一步一步判断即可

代码如下:
#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    // 初始化变量
    char c; int p=0, pa=0, pat=0;

    // 统计
    while(scanf("%c", &c) && c!=' ' && c!='\n') {
        if(c == 'P') {
            p++;
        } else if(c == 'A') {
            pa += p;
            pa = pa%1000000007;
        } else {
            pat += pa;
            pat = pat%1000000007;
        }
    }
    printf("%d\n", pat);
    return 0;
} 


发表于 2015-10-26 17:22:54 回复(20)
类似上台阶问题
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String text = in.next();
		int pCount = 0;
		int paCount = 0;
        int total = 0;
		for(int i = 0;i<text.length();i++){
			char c = text.charAt(i);
			if(c=='P'){
				pCount++;
			}else if(c=='A'){
				paCount += pCount;
			}else{
				total += paCount;
				total %= 1000000007;
			}
		}
		System.out.println(total);
	}
}

发表于 2016-06-12 16:24:23 回复(3)
#include <iostream>
using namespace std;
char s[100010];
int main(){
    cin>>s;
    long long p=0,pa=0,pat=0;
    for(int i=0;s[i];i++){
        if(s[i]=='P') p++;         //i及左边共几个p
        else if(s[i]=='A') pa+=p;  //i及左边共几个pa
        else pat+=pa;              //i及左边共几个pat
    }
    cout<<pat%1000000007;
    return 0;
}

发表于 2018-02-11 23:53:55 回复(1)
import java.util.Scanner;

/**
 * 有几个PAT
 * 题目描述
 * 字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);
 * 第二个PAT是第3位(P),第4位(A),第6位(T)。现给定字符串,问一共可以形成多少个PAT?
 * 输入描述:
 * 输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。
 * 输出描述:
 * 在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。
 * 输入例子:
 * APPAPT
 * 输出例子:
 * 2
 *
 * @author shijiacheng
 * @date 2018/2/1
 */
public class B1030HowManyPAT {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        char[] chars = str.toCharArray();

        int countT = 0;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == 'T') {
                countT++;
            }
        }
        int countP = 0;
        int result = 0;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == 'P') {
                countP++;
            }
            if (chars[i] == 'T') {
                countT--;
            }
            if (chars[i] == 'A') {
                result = (result + (countP * countT) % 1000000007) % 1000000007;
            }
        }

        System.out.println(result);
    }
}
发表于 2018-02-01 22:11:01 回复(1)
感觉写的不是很好,没有其他老哥写的简洁
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        
        int count = 0,tempCount = 0,countT = 0;
        int lastA = 0,lastT = 0;
        for(int i = s.length() - 1;i >= 0;i--){
            if(s.charAt(i) == 'P'){
                if(tempCount != 0){
                    if(count == 0)count = tempCount;
                    else count += tempCount;
                    count %= 1000000007;
                }

            }else if(s.charAt(i) == 'A'){
                lastA = i;
                if(lastA < lastT && lastA != 0)tempCount += countT ; 
                tempCount %= 1000000007;
            }else if(s.charAt(i) == 'T'){
                countT++;
                countT %= 1000000007;
                lastT = i;
            }
        }

        System.out.print(count);
    }
}


发表于 2024-01-31 15:27:12 回复(1)
#include<bits/stdc++.h>
using namespace std;

const int MOD=1000000007;
const int Max=100010;

int main(){
    string str;
    while(cin>>str){
        int n=str.size();
        int leftNumP[Max]={0},rightNumT=0,answer=0;
        for(int i=0;i<n;i++){
            if(i>0){
                leftNumP[i]=leftNumP[i-1];
            }
            if(str[i]=='P'){
                leftNumP[i]++;
            }
        }
        for(int i=n-1;i>=0;i--){
            if(str[i]=='T'){
                rightNumT++;
            }
            if(str[i]=='A'){
                answer+=rightNumT*leftNumP[i];
                answer%=MOD;
            }            
        }
        cout<<answer<<endl;
    }
    return 0;
}
发表于 2022-10-21 11:02:53 回复(3)