题目链接: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 }