一级标题 1040 有几个PAT c++
今天做一题通过率0.27的PAT
每次扫描到A,用这个A组成的PAT刚好是A前面的P数量乘以A后面T的数量
然后相加
心情可谓是一言难尽
前三个测试点都过 后两个测试点超时 。
如果不超时 算法应该没问题。
去搜了一下别人写的,是真简单;
//自己写的代码超时,后两个测试点
#include<iostream>
using namespace std;
#include<string>
#include<vector>
int main()
{
string str1;
cin >> str1;
int pos1 = str1.find('P');
int pos2 = str1.rfind('T');
string str2 = str1.substr(pos1, pos2 - pos1+1);
vector<char>str;
//cout << str2 << endl;
for (int i = 0; i < str2.size(); i++)
{
str.push_back(str2[i]);
}
int sum = 0;
for (int i = 0; i < str.size(); i++)
{
if (str[i] == 'A')
{
int count1 = 0;
int count2 = 0;
for (int j = 0; j < i; j++)
{
if (str[j] == 'P')
{
count1++;
}
}
for (int j = i+1; j < str.size(); j++)
{
if (str[j] == 'T')
{
count2++;
}
}
//cout << count1 << " " << count2 << endl;
vector<char>::iterator pos1 = str.begin() + i;
str.erase(pos1);//把当前A删除,计算下一个
//str[i] = 'Q';
sum += (count1 * count2) % 1000000007;
}
}
cout << sum;
return 0;
}
后来看别人写的
#include<iostream>
using namespace std;
int main(){
string str;
cin>>str;
int count=0;
int countP=0,countT=0;
int Len=str.size();
//PAT数量等于字符数组之中每个A左边的P的数量与右遍的T的数量的乘积
for(int i=0;i<Len;i++){
if(str[i]=='T'){
countT++;
}
}
for(int i=0;i<Len;i++){
if(str[i]=='P'){
countP++;
}
if(str[i]=='T'){
countT--;
}
if(str[i]=='A'){
//cout<<countP<<" "<<countT<<endl;
count=(count+countP*countT)%1000000007 ;
}
}
cout<<count;
return 0;
}