PAT 1093 Count PAT‘s
这一题给出一个字符串让我们找出这里面有多少个不同的叫做"PAT“的字符串。
我们可以枚举中件字符‘A’
那么我们只需要提前统计出来左边的P的数量和右边的T的数量,它们相乘就是该中间字符’A’能构成的PAT的数量,只需要找到字符串中有多少个P即可以统计出来有多少个”PAT“的字符串
这和左维护右枚举的思想类似。
属于这种题型中的三个元组,枚举中间的那种题型。
类似的题目有:
力扣2874. 有序三元组中的最大值 II
完整代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <limits.h>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
string s;
long long p[100005];
long long t[100005];long long ans;
int main()
{//ios::sync_with_stdio(0),cin.tie(0),cout.tie(cin>>s;for(int i=0;i<s.size();i++){if(i==0){if(s[i]=='P'){p[i]++; }else if(s[i]=='T'){t[i]++;}}else{if(s[i]=='P'){p[i]=p[i-1]+1;t[i]=t[i-1]; }else if(s[i]=='T'){t[i]=t[i-1]+1;p[i]=p[i-1];}else{p[i]=p[i-1];t[i]=t[i-1];}}} for(int i=0;i<s.size();i++){if(s[i]=='A'){//cout<<p[i]<<" "<<(t[s.size()-1]-t[i])<<endl;ans=(ans%1000000007+p[i]*(t[s.size()-1]-t[i])%1000000007)%1000000007;}}cout<<ans;return 0;}
注意题目要求最后%1000000007,说明有些数据可能很大,因此我们应该开long long 然后对可能溢出的数据%1000000007。