1040 有几个PAT

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LightInDarkness/article/details/82917964

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

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

输入格式:

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

输出格式:

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

输入样例:

APPAPT

输出样例:

2

分析:

       方法一:遍历字符串,找出T的数量。从头开始再对字符串进行一次遍历,遇到P统计当前P的数量,遇到T统计该字符之后T的数量,遇到A计算每个A可组成PAT的数量,即:P * T,累计即可。

#include<iostream>

using namespace std;

int main(){
	int pos = 0, cnt = 0;
	int P = 0, T = 0;
	string s;
	cin >> s;
	for(int i = 0; i < s.length(); i++)
		if(s[i] == 'T') T++;
	for(int i = 0; i < s.length(); i++){
		if(s[i] == 'P') P++;
		else if(s[i] == 'T') T--;
		else if(s[i] == 'A') cnt += P * T;
		cnt %= 1000000007;
	}
	cout << cnt;
}

       方法二:要统计PAT的数量,就需要知道当前T之前PA的数量;要知道PA的数量,就需要知道当前A之前P的数量。那么遇到P,则P++;遇到A,则PA += P;遇到T,PAT += PA。

#include <iostream>
 
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;
        }else{
			pat += pa;
			pat = pat % 1000000007;
		}
	}
	printf("%d\n", pat);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LightInDarkness/article/details/82917964