题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805373582557184
题意
求出给定的字符串还有多少个“PAT”子串
代码解析
两段代码都是一个意思,就是每一个A前后的P和T的数量相乘就是这个A对应的PAT子串数量,遍历每一个A并加和就是最终的结果
我自己的思路就是通过upper_bound函数寻找A前后的P、T数量,但第二段代码明显更简洁一些
AC代码
本人代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
vector<int> p,a,t;
long long sum=0;
for(int i=0;s[i];i++)
{
if(s[i]=='P') p.push_back(i);
else if(s[i]=='A') a.push_back(i);
else if(s[i]=='T') t.push_back(i);
}
for(int i=0;i<a.size();i++)
{
int pos1=upper_bound(p.begin(),p.end(),a[i])-p.begin();
int pos2=upper_bound(t.begin(),t.end(),a[i])-t.begin();
sum=(sum+pos1*(t.size()-pos2))%1000000007;
}
cout<<sum;
}
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int p=0,t=0,sum=0;
for(int i=0;s[i];i++)
if(s[i]=='T') t++;
for(int i=0;s[i];i++)
{
if(s[i]=='P') p++;
else if(s[i]=='T') t--;
else if(s[i]=='A') sum=(sum+p*t)%1000000007;
}
cout<<sum;
}