题目链接: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 ;
}

最新文章

  1. easyui datagrid tooltip
  2. R 实例1
  3. Codeforces Round #263 (Div. 2) A B C
  4. 【转】Linux设备驱动之Ioctl控制
  5. 服务端NETTY 客户端非NETTY处理粘包和拆包的问题
  6. .NET使用NPOI组件将数据导出Excel
  7. hdu 1421 搬寝室 (dp)
  8. Google maps API开发
  9. HDU 3038 How Many Answers Are Wrong (并查集)---并查集看不出来系列-1
  10. BezierDemo开源项目的学习
  11. CentOS搭建OpenVPN以及WIN&amp;Android&amp;iOS的安装连接
  12. Chapter2:Qt5模板库,工具类及控件
  13. tomcat中如何配置虚拟路径
  14. 关于RabbitMQ一点
  15. Web Service(上)
  16. C# 与 Java Rsa加密与解密互通
  17. Linux文件访问流程及磁盘inode和block总结
  18. dom4j.jar有什么作用?
  19. 3dContactPointAnnotationTool开发日志(十一)
  20. Redis特性之持久化机制

热门文章

  1. 工作总结 datatable 里的 数据 rows Columns
  2. HDU 1255 覆盖的面积(线段树+扫描线)
  3. 约瑟夫环问题(猴子选大王)PHP版
  4. Android 淘宝搜索记录分析及千牛数据库名称关联
  5. 《转》OpenStack对象存储——Swift
  6. kafka02
  7. Android中静态变量的生命周期
  8. 布局技巧4:使用ViewStub
  9. 【Poj1325】Machine Schedule机器调度
  10. hdu 6115(LCA 暴力)