PAT-乙级-1040 有几个PAT
预处理后缀计数:我们首先计算每个位置后面有多少个'T'。这可以通过从右到左遍历字符串来实现。 预处理前缀计数:然后我们计算每个位置前面有多少个'P'。这可以通过从左到右遍历字符串来实现。 计算总数:对于每个位置,如果该位置是'A',我们计算前面有多少个'P'和后面有多少个'T',然后将这些组合起来,计算总数。 预处理count_T数组:从右到左遍历字符串,计算每个位置后面有多少个'T'。这帮助我们快速确定每个'A'后面有多少个'T'。 预处理count_P数组:从左到右遍历字符串,计算每个位置前面有多少个'P'。这帮助我们快速确定每个'A'前面有多少个'P'。 计算总数:遍历字符串,对于每个'A',计算前面有多少个'P'和后面有多少个'T',然后将这些组合起来,累加得到结果。
发布日期:2025-05-01 23:07:27
浏览次数:13
分类:精选文章
本文共 1023 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要计算给定字符串中能形成多少个" PAT "。这里的" PAT "并非连续的三个字符,而是三个字符分别在三个不同的位置上。
方法思路
为了高效地解决这个问题,我们可以采用以下方法:
这种方法的时间复杂度是O(n),适合处理长度为10^5的字符串。
解决代码
s = input().strip()n = len(s)MOD = 10**9 + 7# 预处理count_T数组:count_T[i]表示从i后面(包括i+1)到末尾的T的数量count_T = [0] * (n + 1)for i in range(n-1, -1, -1): if s[i] == 'T': count_T[i] = count_T[i+1] + 1 else: count_T[i] = count_T[i+1]# 预处理count_P数组:count_P[i]表示前面(包括0到i-1)有多少个Pcount_P = [0] * (n + 1)for i in range(n): count_P[i+1] = count_P[i] + (1 if s[i] == 'P' else 0)# 计算结果res = 0for j in range(n): if s[j] == 'A': res = (res + count_P[j] * count_T[j+1]) % MODprint(res % MOD)
代码解释
这种方法确保了我们在O(n)时间复杂度内解决问题,适用于大规模输入。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2026年06月16日 15时48分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php 文字弹幕效果代码,HTML5文字弹幕效果
2023-02-28
php 时间日期函数,获取今天开始时间,结束时间
2023-02-28
php 标准规范
2023-02-28
PHP 浮点型精度运算相关问题
2023-02-28
php 浮点型计算精度问题
2023-02-28
php 特定时间段统计,jpgraph某个时间段的数据统计
2023-02-28
php 生成csv mac下乱码
2023-02-28
php 生成证书 签名及验签
2023-02-28
PHP 的标准输入与输出
2023-02-28
php 笔记 (早前的,很乱)
2023-02-28
PHP 第一天
2023-02-28
Redis使用量暴增,快速定位有哪些大key在作怪
2023-02-28
PHP 统计数据功能 有感
2023-02-28
SpringBoot处理JSON数据
2023-02-28
PHP 输入输出流合集
2023-02-28
php--防止sql注入的方法
2023-02-28
php-兔子问题,斐波那契数列
2023-02-28
php-有序数组合并后仍有序
2023-02-28
php-约瑟夫问题
2023-02-28