PATBasic——1040. 有几个PAT(25)
2015-07-01 14:21
295 查看
1040. 有几个PAT(25)
时间限制120 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CAO, Peng
字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)。
现给定字符串,问一共可以形成多少个PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。
输出格式:
在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。
输入样例:
APPAPT
输出样例:
2
每次做PAT题,我都很赶时间,没弄清楚题意,就开始码代码,真是醉了。再次提醒自己,认真认真认真审题!!!
这题在纸上画一画,会比较容易找到思路。
1、一开始我想的是,从头到尾或者从后到前来遍历字符串,出现P时,计算A,出现A后,再找T,然后自己就晕了……然后又想从后往前找,找到第一个T,找第一个A,再找P……再次被自己搞晕了……
2、然后我又把字符串中每个字符对应的下标标出来了,一看,可以将PAT出现位置对应的数字都记下来,然后计算T>A>P这样条件的组合有多少,貌似是个排列组合的问题么?晕到是没晕,快速三个for循环嵌套,实现了……不过,运行超时!这么多for循环,相当于遍历字符串这么多次,不超时才怪!
3、最后一版本是正确思路。这个问题,其实应该拆分一下。以从后往前遍历为例,先找到T,找到AT组合的个数,再找PAT,这样可以把问题简化。T的个数,从找到第一个T开始++,然后找第一个A,这样AT的个数为原先T的个数,即numT,如果再遍历都没有遇到P,又遇到了A,则A个数为2,AT个数就变成了numT+numT(一个A对应了numT个AT)。一次类推就很好想了……PAT的个数,就等于加上numAT,每次遇到P,就加numAT. 最终的代码如下:
第二次代码:
#include<vector>
#include <sstream>
#include<cmath>
#include<iomanip>
#include<iostream>
#include <ctype.h>
#include <stdlib.h>
using namespace std;
int main()
{
string s;
cin >> s;
int numT = 0;
int numAT = 0;
int numPAT = 0;
int num = 1000000007;
for (int i = s.length() - 1; i >= 0; i--)//从后往前进行遍历
{
char si = s[i];
if (si == 'T')//找到T的个数
{
numT++;
}
else if (si == 'A')
{
numAT = (numAT + numT) % num;//计算AT个数,为后面T的个数,加当前A的个数
}
else
{
numPAT = (numPAT + numAT) % num;//与计算AT个数道理类似
}
}
cout << numPAT;
return 0;
}
第一次代码:
int main()
{
//vector<int> Plocts;
//vector<int> Alocts;
//vector<int> Tlocts;
int Plocts[33334] = { 0 };
int Alocts[33334] = { 0 };
int Tlocts[33334] = { 0 };
int pc = 0, ac = 0, tc = 0;
string s;
//s = "APPAPTPAAPTPPATTTAPA";
cin >> s;
for (int i = 0; i < s.length(); i++)
{
char a = s[i];
if (a == 'P')
{
Plocts[pc]=i;
pc++;
}
else if (a=='A')
{
Alocts[ac]=i;
ac++;
}
else if (a=='T')
{
Tlocts[tc]=i;
tc++;
}
}
int count = 0;
for (int i = 0; i < pc; i++)
{
//int pl = Plocts[i];
for (int j = 0; j < ac; j++)
{
//int al = Alocts[j];
if (Alocts[j]>Plocts[i])//A的位置大于P,即A在P后面
{
for (int k = 0; k < tc; k++)
{
//int tl = Tlocts[k];
if (Alocts[j]<Tlocts[k])
{
count = count + tc - k;
break;
}
}
}
}
}
if (count < 1000000007)
{
cout << count;
}
else
{
cout << count % 1000000007;
}
return 0;
}
相关文章推荐
- Play 2.4 学习笔记
- 微软发布win10 SDK预览版(附下载地址) 内置Win10 Mobile模拟器
- android 项目R.java文件缺失导致编译错误
- 嵌入式Linux启动过程中的问题积累
- 谷歌Volley网络框架讲解——第一篇
- MBProgressHUD的基本使用
- main函数总结
- andoid handler机制
- 30个php操作redis常用方法代码例子
- left join 条件区别
- linux用户和组
- CocoaPods pod install/pod update更新慢的问题
- 课程实训之银行系统第一版
- 谷歌Volley网络框架讲解——Network及其实现类
- SDN交换机的拓扑发现与ARP处理
- 查看Linux系统版本,适用于RedHat,CentOS
- return 用法总结
- 极客学院
- VMware、RHEL的网络配置
- AppDelegate中几个惯用的回调调用时机