题目链接:1040 有几个PAT (25 分)

做这道题目,遇到了新的困难。解决之后有了新的收获,甚是欣喜!

刚开始我用三个vector数组存储P A T三个字符出现的位置,然后三层for循环,根据字符次序关系,

统计PAT出现的次数。这样提交后三个测试点超时。代码如下:

 #include <bits/stdc++.h>
using namespace std; int num=;
char str[]; vector<int> p;
vector<int> a;
vector<int> t;
int main()
{
scanf("%s",str); //输入指定字符串
int count=;
for(int i=;i<strlen(str);i++)
{
if(str[i]=='P')
p.push_back(i);
else if(str[i]=='A')
a.push_back(i);
else
t.push_back(i);
}
for(int i=;i<p.size();i++)
{
for(int j=;j<a.size();j++)
{
for(int k=;k<t.size();k++)
{
if(p[i]<a[j]&&a[j]<t[k])
count++;
}
}
}
printf("%d",count%num);
return ;
}

后来改进为两层for循环,依旧超时!冥思苦想不得其解,不得已求助网上大神。

具体思想:要想知道构成多少个PAT,那么遍历字符串后对于每一个A,它前面的P的个数和它后面的

T的个数的乘积就是能构成PAT的个数。然后依次累加每个A的结果即可。

统计当前字符A的前面的P的个数简单容易

那么怎么统计当前字符A的后面的T的个数呢?

可以先遍历整个字符串统计整个字符串中T的个数。可以再下一次遍历时,遇到一个T就做一次自减操作,

这样就可以得到当前字符A的后面的T的个数。

整个算法伪代码如下

先遍历整个字符串,统计T的个数countT

遍历整个字符串

若遇到P,当前字符前的P的个数++,countP++

若遇到T,countT--,表示当前字符A后的T的个数

若遇到字符A,统计当前字符A可以构成多少个PAT,即countP*countT,然后累加每次A的结果。

 #include <bits/stdc++.h>
using namespace std; char str[]; int main()
{
scanf("%s",str);
int ans=;
int countP,countT;
countP=countT=;
//先统计整个字符串中T的个数即countT
for(int i=;i<strlen(str);i++)
{
if(str[i]=='T')
countT++;
}
for(int i=;i<strlen(str);i++)
{
if(str[i]=='P')
countP++;
else if(str[i]=='T')
countT--;//总的T的个数减去待统计字符A的之前的T的个数,等于待统计A的之后的T的个数,秒!
else
ans=(ans+countP*countT)%;
}
printf("%d",ans);
return ;
}

1040 有几个PAT (25 分)的更多相关文章

  1. 1040 有几个PAT (25 分)

    题目:1040 有几个PAT (25 分) 思路: 是个规律题,只要找到规律就有思路,那代码基本就有了,就是怎么实现比较好和是否简洁的问题. 很明显:A是分水岭,A前面有多少个P和A后面有多少个T知道 ...

  2. PAT Basic 1040 有几个PAT (25 分)

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

  3. 1040 有几个PAT (25 分)C语言

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

  4. PAT Advanced 1153 Decode Registration Card of PAT (25 分)

    A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...

  5. PAT甲级——1153.Decode Registration Card of PAT(25分)

    A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...

  6. PAT 1040有几个PAT

    原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616 1040 有几个PAT (25 分) ...

  7. PAT乙级1040 有几个PAT

    题目: 1040 有几个PAT (25分)   字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位 ...

  8. PAT(B) 1040 有几个PAT(Java)

    题目链接:1040 有几个PAT (25 point(s)) 题目描述 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 ...

  9. PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)

    1040 Longest Symmetric String (25 分)   Given a string, you are supposed to output the length of the ...

随机推荐

  1. 关于Tomcat的点点滴滴(体系架构、处理http请求的过程、安装和配置、文件夹结构、设置压缩和对中文文件名称的支持、以及Catalina这个名字的由来……等)

    总结Tomcat的体系架构.处理http请求的过程.安装和配置.文件夹结构.设置压缩和对中文文件名称的支持.以及Catalina这个名字的由来--等. Tomcat和JVM: 一个Tomcat仅仅会启 ...

  2. Swift 进阶

    iOS开发系列--Swift进阶 2015-09-21 00:01 by KenshinCui, 3072 阅读, 12 评论, 收藏, 编辑 概述 上一篇文章<iOS开发系列--Swift语言 ...

  3. jQuery事件传播,事件流

    一. jQuery事件传播 在DOM2级事件模型中,一旦事件被触发.事件流首先从DOM树顶部(文档节点)向下传播.直到目标节点.然后再从目标节点向上传播到DOM树顶.从上到下的过程被称为捕获阶段.从下 ...

  4. Linux下的应用程序开机自启动

    Linux下的应用程序开机自启动,目前我知道的有2种: 1.将启动语句写到/etc/rc.local 2.在init.d放置启动脚本 第一种,很简单,直接写进去就行,比如说: /db/mongodb/ ...

  5. js 四种调用方式 Method Invocation Pattern

    4.3. Invocation Invoking a function suspends the execution of the current function, passing control ...

  6. MapReduce04

    ===================== MapReduce内部机制:本地性 ===================== 什么是数据本地性(data locality)--------------- ...

  7. 如何扩大VMware中的ubuntu虚拟机的磁盘大小

    我是在VMware中安装的ubuntu. 最近虚拟机磁盘空间不够,需要扩展,在虚拟机中设置了扩展20G,然后在ubuntu中发现扩展的20G并不能用.... 正确的扩展方法是: 1.先在虚拟机中的se ...

  8. JavaScript Patterns 2.1 Writing Maintainable Code

    Revisiting the code after some time has passed requires: • Time to relearn and understand the proble ...

  9. openstack 虚拟机导出

  10. CSS3径向渐变实现优惠券波浪造型

    效果看下图: 左右的波浪边框用CSS搞定这个效果.利用CSS radial-gradient() 函数 CSS 语法: background: radial-gradient(shape size a ...