题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4339

题意:给出两个字符串S1,S2,进行两种操作:

(1)1 a i c  在字符串Sa中,将Sa[i]变成c

(2)2 i,求从i下标开始的最长匹配长度。

View Code
  1 #include <stdio.h>
  2 #include <string.h>
  3 #define lson l,m,rt<<1
  4 #define rson m+1,r,rt<<1|1
  5 #define maxn 1000001
  6 struct node
  7 {
  8     int pos;
  9 }setree[maxn<<2];
 10 char s1[maxn],s2[maxn];
 11 int max(int a,int b)
 12 {
 13     return a>b?a:b;
 14 }
 15 int min(int a,int b)
 16 {
 17     return a<b?a:b;
 18 }
 19 void pushup(int rt,int len,int l)
 20 {
 21     if(len-len/2==setree[rt<<1].pos-l+1&&setree[rt<<1|1].pos!=-1)
 22     setree[rt].pos=setree[rt<<1|1].pos;
 23     else
 24     setree[rt].pos=setree[rt<<1].pos;
 25 }
 26 void build(int l,int r,int rt)
 27 {
 28     if(l==r){
 29         if(s1[l]==s2[l])
 30         setree[rt].pos=l;
 31         else
 32         setree[rt].pos=-1;
 33         return ;
 34     }
 35     int m=(l+r)>>1;
 36     build(lson);
 37     build(rson);
 38     pushup(rt,r-l+1,l);
 39 }
 40 void update(int l,int r,int rt,int num)
 41 {
 42     if(l==r){
 43         if(s1[l]==s2[l])
 44         setree[rt].pos=l;
 45         else
 46         setree[rt].pos=-1;
 47         return ;
 48     }
 49     int m=(l+r)>>1;
 50     if(num<=m)
 51     update(lson,num);
 52     else
 53     update(rson,num);
 54     pushup(rt,r-l+1,l);
 55 }
 56 int query(int l,int r,int rt,int L,int R)
 57 {
 58     if(L<=l&&r<=R)
 59     return setree[rt].pos;
 60     int m=(l+r)>>1;
 61     int ans1=-2,ans2=-2;
 62     if(L<=m)
 63     ans1=query(lson,L,R);
 64     if(R>m)
 65     ans2=query(rson,L,R);
 66     if(ans1==m)
 67     return max(ans1,ans2);
 68     else if(ans1!=-2)
 69     return ans1;
 70     else
 71     return ans2;
 72     
 73 }
 74 int main()
 75 {
 76     int t,cas=1;
 77     scanf("%d",&t);
 78     while(t--){
 79         scanf("%s%s",s1,s2);
 80         int n=min(strlen(s1),strlen(s2)),m;
 81         build(0,n-1,1);
 82         scanf("%d",&m);
 83         printf("Case %d:\n",cas++);
 84         while(m--){
 85             int op;
 86             scanf("%d",&op);
 87             if(op==1){
 88                 int a,b;
 89                 char c[5];
 90                 scanf("%d%d%s",&a,&b,c);
 91                 if(a==1)
 92                 s1[b]=c[0];
 93                 else
 94                 s2[b]=c[0];
 95                 update(0,n-1,1,b);
 96             }
 97             else{
 98                 int a;
 99                 scanf("%d",&a);
100                 int temp=query(0,n-1,1,a,n-1);
101                 if(temp==-1)
102                 printf("0\n");
103                 else
104                 printf("%d\n",temp-a+1);
105             }
106         }
107     }
108     return 0;
109 }