您的位置:首页 > 其它

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

2016-08-31 11:17 417 查看
这个题目求一个字符串中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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: