hdu4339Query

这题是线段树+二分。。

先代码贴上,忘记了好看。。

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 1000050
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
char str1[MAXN];
char str2[MAXN];
int str[MAXN];
int sum[MAXN<<2];
int que;
int len;
void pushup(int rt){
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){
    if(l==r){
        sum[rt]=str[l];
        return;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    pushup(rt);
}
void update(int p,int val,int l,int r,int rt){
    if(l==r&&l==p){
        sum[rt]+=val;
        return;
    }
    int m=(l+r)>>1;
    if(p<=m)update(p,val,lson);
    else update(p,val,rson);
    pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r){
        return sum[rt];
    }
    int m=(l+r)>>1;
    int re=0;
    if(L<=m)re+=query(L,R,lson);
    if(R>m)re+=query(L,R,rson);
    return re;
}
int main(){
  //  freopen("input.txt","r",stdin);
  //  freopen("1009.out","w",stdout);
    freopen("in.txt","r",stdin);
    int tt;
    scanf("%d",&tt);
    for(int cas=1;cas<=tt;cas++){
        printf("Case %d:\n",cas);
        scanf("%s",str1);
        scanf("%s",str2);
        len=max(strlen(str1),strlen(str2));
        for(int i=0;i<len;i++){
            if(str1[i]==str2[i])
            str[i]=1;
            else str[i]=0;
        }
        build(0,len-1,1);
        scanf("%d",&que);
        while(que--){
            int a;
            scanf("%d",&a);
            if(a==1){
                int b,c;
                char d[2];
                scanf("%d%d%s",&b,&c,d);
                if(b==1){
                   str1[c]=d[0];
                }
                else{
                    str2[c]=d[0];
                }
                if(str1[c]==str2[c]&&!str[c]){
                    str[c]=1;
                    update(c,1,0,len-1,1);
                }
                else if(str1[c]!=str2[c]&&str[c]){
                    str[c]=1;
                    update(c,-1,0,len-1,1);
                }
            }
            else{
                int b;
                scanf("%d",&b);
                int l=b,r=len-1;
                int ans=0;
                while(l<=r){
                    int mid=(l+r)>>1;
                    int re=query(l,mid,0,len-1,1);
                    if(re==mid-l+1){
                        ans+=re;
                        l=mid+1;
                    }
                    else{
                        r=mid-1;
                    }
                }
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/arbitrary/p/2633023.html