这个题目求一个字符串中PAT的数目,我们可以这样处理。
对字符串每个字符进行遍历,当字符为P时len1++,当字符为A时,则将len1加入到树状数组中,当字符为T时,对树状数组求和累加并取余。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define ll long long
#define inf 999999999
using namespace std;
char s[100005];
struct tree
{
int sum=1;
vector<int> m=vector<int>(100000,0);
int lowbit(int t)
{
return t&(-t);
}
void add(int pos,int num)
{
while(pos<=100000)
{
m[pos]+=num;
pos+=lowbit(pos);
}
}
int getsum(int x)
{
int ans=0;
while(x)
{
ans=(ans+m[x])%1000000007;
x-=lowbit(x);
}
return ans;
}
};
int len1=0;
int len2=0;
int len3=0;
tree tr;
int main()
{
scanf("%s",s);
int len=strlen(s);
int ans=0;
for(int i=0;i<len;i++)
{
if(s[i]=='P')
{
len1++;
}
else if(s[i]=='A')
{
tr.add(tr.sum,len1);
tr.sum++;
}
else
{
ans=(ans+tr.getsum(tr.sum-1))%1000000007;
}
}
printf("%d",ans);
}