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; }