您的位置:首页 > 其它

hdu 4046 Panda

2012-11-19 11:05 148 查看
题目大意:对于一个给定的字符串(有‘b’和‘w’组成),求其中“wbw”的数目。

这题刚开始做时没什么思路,或许跟我本来就讨厌字符串这类题有关吧。好,废话少说,讲讲思路吧。

这题其实是考线段树的,单点更新,区间合并。合并时要注意一下边界,详细的还是自己看看代码吧。

View Code

#include <stdio.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 50000
struct node
{
int cnt;
}setree[maxn<<2];
char s[50005];
void pushup(int rt,int len,int m,int l,int r)
{
setree[rt].cnt=setree[rt<<1].cnt+setree[rt<<1|1].cnt;
if(len>2){
if(s[m-1]=='w'&&s[m]=='b'&&s[m+1]=='w'&&m>l)
setree[rt].cnt++;
else if(s[m]=='w'&&s[m+1]=='b'&&s[m+2]=='w'&&m<r-1)
setree[rt].cnt++;
}
}
void build(int l,int r,int rt)
{
if(l==r){
setree[rt].cnt=0;
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt,r-l+1,m,l,r);
}
void update(int l,int r,int rt,int num)
{
if(l==r)
return;
int m=(l+r)>>1;
if(num<=m)
update(lson,num);
else
update(rson,num);
pushup(rt,r-l+1,m,l,r);
}
int query(int l,int r,int rt,int L,int R)
{
if(L<=l&&r<=R)
return setree[rt].cnt;
int m=(l+r)>>1;
if(R<=m)
return query(lson,L,R);
else if(L>m)
return query(rson,L,R);
else{
int ans=query(lson,L,m)+query(rson,m+1,R);
if(s[m-1]=='w'&&s[m]=='b'&&s[m+1]=='w'&&m>L&&m<R)
ans++;
else if(s[m]=='w'&&s[m+1]=='b'&&s[m+2]=='w'&&m>=L&&m<R-1)
ans++;
return ans;
}
}
int main()
{
int t,cas=1;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",s);
build(0,n-1,1);
printf("Case %d:\n",cas++);
while(m--){
int op;
scanf("%d",&op);
if(op==1){
int num;
char opp[5];
scanf("%d%s",&num,opp);
s[num]=opp[0];
update(0,n-1,1,num);
}
else{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query(0,n-1,1,l,r));
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: