**浙大PAT甲级 1093 树状数组

来源:互联网 发布:阿里云服务器在哪里 编辑:程序博客网 时间:2024/05/22 12:07

这个题目求一个字符串中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 999999999using 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);}


0 0
原创粉丝点击