PAT--1040 有几个PAT

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

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

输入格式:
输入只有一行,包含一个字符串,长度不超过10^​5,只包含 P、A、T 三种字母。

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

输入样例:
APPAPT
输出样例:
2

分析
从后往前遍历,当前位置PAT数量为A之前P的数量之和和T之前A的数量之和的积。

#include<iostream>
#include<cstdio>
#include<cstring>
#define MOD 1000000007
using namespace std;

int main(){
	char a[100001];
	scanf("%s",&a);
	long numT=0,numAT=0,num=0;	//分别代表A后面有多少个T供选择,P后面有多少个AT供选择 
	for(int i=strlen(a)-1;i>=0;i--){		//从后往前遍历 
		switch(a[i]){
			case 'T':
				numT++;	//T的选择+1 
				num%=MOD;
				break;
			case 'A':
				numAT=numAT+numT;	//AT的选择=之前遍历过了的A的选择+当前A的选择 
				numAT%=MOD;
				break; 
			case 'P':
				num=num+numAT;		//PAT的选择=之前遍历过了的P的选择+当前P的选择 
				num%=MOD;
				break;
		}
	}
	cout<<num;
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值