hdu4339query

来源:互联网 发布:九九乘法表 java 编辑:程序博客网 时间:2024/06/05 15:48

Query
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3188 Accepted Submission(s): 1037

Problem Description
You are given two strings s1[0..l1], s2[0..l2] and Q - number of queries.
Your task is to answer next queries:
1) 1 a i c - you should set i-th character in a-th string to c;
2) 2 i - you should output the greatest j such that for all k (i<=k and k

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;const int maxn = 1000007;int flag[maxn<<2],sum[maxn<<2],t,cas = 1;char s1[maxn],s2[maxn];#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1void push(int rt){    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void build(int l,int r,int rt){    if(l == r)    {        if(s1[l] == s2[l]) flag[l] = 1;        else flag[l] = 0;        sum[rt] = flag[l];        return ;    }    int m = (l+r)>>1;    build(lson);    build(rson);    push(rt);}void update(int op,int pos,char c,int l,int r,int rt){    if(l == r)    {        if(op == 1) s1[l] = c;        if(op == 2) s2[l] = c;        if(s1[l] == s2[l]) flag [l] = 1;        else flag[l] = 0;        sum[rt] = flag[l];        return ;    }    int m = (l+r)>>1;    if(pos<=m) update(op,pos,c,lson);    else update(op,pos,c,rson);    push(rt);}int query(int pre,int l,int r,int rt){    if(l==r)return sum[rt];    if(l<=pre&&pre<=r)    {        if(sum[rt]==r-l+1)        return r-pre+1;        else        {            int m=(l+r)>>1;            int cat=0;            if(pre<=m)            {                cat+=query(pre,lson);                if(cat==m-pre+1)                cat+=query(m+1,rson);            }            else            cat+=query(pre,rson);            return cat;        }    }}int main(){    int t;    while(scanf("%d",&t)!=EOF)    {        scanf("%s%s",s1+1,s2+1);        int len1=strlen(s1+1);        int len2=strlen(s2+1);        int len=max(len1,len2);        build(1,len,1);        int m,num,pre,idx;        char c[2];        scanf("%d",&m);        printf("Case %d:\n",cas++);        while(m--)        {            scanf("%d",&num);            if(num==2)            {                scanf("%d",&pre);                printf("%d\n",query(pre+1,1,len,1));            }            else            {                scanf("%d%d%s",&idx,&pre,&c);                update(idx,pre+1,c[0],1,len,1);            }        }    }    return 0;}
0 0
原创粉丝点击