PAT A1093 Count PAT's (25)

PTA跳转:原题链接

这道题目大意是输入只有"P",“A”,“T"三个字符组成的字符串,计算出字符串中有多少个"PxAxT”(其中,x表示"P",“A”,"T"这三个字符中的任何一个字符,或者为空)。

如"ATPAPAT"中就有3个"PAT",分别是[2][3][6],[2][5][6],[4][5][6]

这道题难点在于时间限制不是往常的400ms,而是变成150ms,多重循环会超时。后来参照柳神的解题思路写出如下代码,只需要2次一重循环就可解决问题。

第一次循环的任务是把 “T” 的数量计算出来,"P"和"A"不管。

第二次循环逐个字符进行判断,刚开始时,nP为0,nT为第一次循环所得。如果如果字符串的前两个字符都是"P",则nP变为2。如果接下来的字符是"A",则result在自身的基础上加上 " nP * nT "(即这个字符"A"左边有nP个字符"P",右边有nT个字符"T")。对每个字符进行操作,直到遍历至字符串结尾。

为什么要对1000000007取模?原因

代码如下:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
	cin >> s;
	int len = s.length(), result = 0, nP = 0, nT = 0;
	for(int i = 0; i < len; i++){
		if (s[i] == 'T')
			nT++;   //先把字符串'T'的数量计算出来
	}
	for(int i = 0; i < len; i++){
		if(s[i] == 'P')
            nP++;
		else if(s[i] == 'T')
            nT--;
		else if(s[i] == 'A')
            result = (result + (nP * nT) % 1000000007) % 1000000007;  //这个'A'前面有nP个'P',后面有nT个"T"
	}
	cout << result;
	return 0;
}


氷鸢鸢鸢
2020.2.19

发布了19 篇原创文章 · 获赞 21 · 访问量 4506

猜你喜欢

转载自blog.csdn.net/koori_145/article/details/104397288