hdu_4046_Panda(树状数组)

本文介绍了HDU 4046题目中使用树状数组来计算给定区间内特定字符串模式wbw数量的方法。通过修改字符并更新对应的树状数组值,实现高效查询。

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4046

题意:一大堆篇幅介绍,跳过直奔主题,让你寻找给定区间的“wbw”的个数。

题解:直接上树状数组,改变字符后对应改变3个值就行,注意的是询问 [l,r],应该对应输出的是[l+1,r]。因为sum[l+1]记录了a[l-1],a[l],a[l+1]。

#include<cstdio>
const int maxn=50001;
int tree[maxn],n;
char a[maxn];
void fre(){freopen("c:\\acm\\input.txt","r",stdin);}
inline void add(int x,int v){for(;x<=n;x+=x&-x)tree[x]+=v;}
inline int ask(int x){int an=0;for(;x;x-=x&-x)an+=tree[x];return an;}
void change(int x,char y){
    int cg[3],after[3];
    for(int i=0;i<=2;i++){
        if(x+i-2<1)cg[i]=0;
        else if(a[x+i-2]=='w'&&a[x+i-1]=='b'&&a[x+i]=='w')cg[i]=1;
        else cg[i]=0;
    }
    a[x]=y;
    for(int i=0;i<=2;i++){
        if(x+i-2<1)after[i]=0;
        else if(a[x+i-2]=='w'&&a[x+i-1]=='b'&&a[x+i]=='w')after[i]=1;
        else after[i]=0;
    }
    for(int i=0;i<=2;i++){
        int kk=after[i]-cg[i];
        if(kk!=0)add(x+i,kk);
    }
}
int main(){
    //fre();
    int t,ic=1,m,cmd;
    scanf("%d",&t);
    while(t--){
        printf("Case %d:\n",ic++);
        scanf("%d%d",&n,&m);
        scanf("%s",a+1);
        for(int i=1;i<=n;i++)tree[i]=0;
        for(int i=3;i<=n;i++)if(a[i]=='w'&&a[i-1]=='b'&&a[i-2]=='w')add(i,1);
        for(int i=1;i<=m;i++){
            scanf("%d",&cmd);
            if(cmd==0){
                int x,y;
                scanf("%d%d",&x,&y);
                x++,y++;
                if(y-x<2){printf("0\n");continue;}
                if(y-x==2){if(a[x]=='w'&&a[x+1]=='b'&&a[x+2]=='w')printf("1\n");else printf("0\n");}
                else printf("%d\n",ask(y)-ask(x+1));
            }else{
                int x;
                char y[2];
                scanf("%d%s",&x,y);
                x++;
                if(a[x]==y[0])continue;
                else change(x,y[0]);
            }
        }
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/5696185.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值