hdu-4339-Query
这题是线段树+二分。。
先代码贴上,忘记了好看。。
#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;
}

浙公网安备 33010602011771号