http://acm.hdu.edu.cn/showproblem.php?pid=4339

血与泪,伤与痛,无须多言

线段树找数列中任意起点最多有多少连续的1

View Code
#include <iostream>
#include <string.h>
using  namespace std ;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=1000001 ;
char s1[maxn],s2[maxn] ;
int tree[maxn<<2] ;
int n ;
void pushup(int l,int r,int rt)
{
    int m=(l+r)>>1 ;
    if(tree[rt<<1]==m-l+1)
        tree[rt]=tree[rt<<1]+tree[rt<<1|1] ;
    else
        tree[rt]=tree[rt<<1] ;
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        tree[rt]=(s1[l]==s2[l]) ;
        return ;
    }
    int m=(l+r)>>1 ;
    build(lson) ;
    build(rson) ;
    pushup(l,r,rt) ;
}
void update(int a,int p,char c,int l,int r,int rt)
{
    if(l==r)
    {
        if(a==1)
        {
            s1[p]=c ;
            tree[rt]=(s1[l]==s2[l]) ;
        }
        else
        {
            s2[p]=c ;
            tree[rt]=(s1[l]==s2[l]) ;
        }
        return ;
    }
    int m=(l+r)>>1 ;
    if(p<=m)
        update(a,p,c,lson) ;
    else
        update(a,p,c,rson) ;
    pushup(l,r,rt) ;
}
int query(int p,int l,int r,int rt)
{
    if(l==p)
        return tree[rt] ;
    int m=(l+r)>>1 ;
    int ans ;
    if(p<=m)
    {
        ans=query(p,lson) ;
        if(ans==m-p+1) 
            ans+=query(m+1,rson) ;
    }
    else
        ans=query(p,rson) ;
    return ans ;
}
int main()
{
    int t ;
    scanf("%d",&t) ;
    for(int cas=1;cas<=t;cas++)
    {
        scanf("%s%s",s1,s2) ;
        n=min(strlen(s1),strlen(s2)) ;
        build(0,n-1,1) ;
        int Q ;
        scanf("%d",&Q) ;
        printf("Case %d:\n",cas) ;
        while(Q--)
        {
            int op ;
            int a,p ;
            scanf("%d",&op) ;
            if(op==1)
            {
                char c[2] ;
                scanf("%d%d%s",&a,&p,c) ;
                if(p<n)
                    update(a,p,c[0],0,n-1,1) ;
            } 
            else
            {
                scanf("%d",&p) ;
                if(p<n)
                    printf("%d\n",query(p,0,n-1,1)) ;
                else
                    puts("0") ;
            }
        }
    }
    return 0 ;
}