http://acm.hdu.edu.cn/showproblem.php?pid=4339
对线段树还是不熟悉吧 写起来挺费劲的 大体知道怎么写 还是老出错 一直纠结区间被砍开了 怎么找剩余的部分 这部分还必须是跟第一部分连着的
后来想到找到第一个区间之后 以区间的r+1作为新的查找点继续递归查找
犯了很二的错误 建树建小了 该是100W 折腾了差不多4小时吧
View Code
1 #include<stdio.h> 2 #include<string.h> 3 struct node 4 { 5 int l,r,data; 6 }s[3000000]; 7 #define N 1000001 8 char c1[1000003],c2[1000003]; 9 int num[1000003]; 10 int re,k,flag; 11 void push(int w) 12 { 13 s[w].data = s[2*w].data+s[2*w+1].data; 14 } 15 void ctree(int l,int r,int w) 16 { 17 s[w].l = l; 18 s[w].r = r; 19 if(l==r) 20 { 21 s[w].data = num[l]; 22 return ; 23 } 24 int m = (l+r)/2; 25 ctree(l,m,2*w); 26 ctree(m+1, r,2*w+1); 27 push(w); 28 } 29 void add(int p,int w,int da) 30 { 31 if(s[w].l==s[w].r) 32 { 33 s[w].data = da; 34 return ; 35 } 36 int m = (s[w].l+s[w].r)/2; 37 if(p>m) 38 add(p,2*w+1,da); 39 else 40 add(p,2*w,da); 41 push(w); 42 } 43 void search(int p,int w) 44 { 45 if(p==s[w].l&&s[w].data==s[w].r-s[w].l+1) 46 { 47 re += s[w].data; 48 if(num[s[w].r+1]==0) 49 return ; 50 if(s[w].r<k) 51 search(s[w].r+1,1); 52 return ; 53 } 54 if(s[w].l==s[w].r) 55 return ; 56 int m = (s[w].l+s[w].r)/2; 57 if(p>m) 58 search(p,2*w+1); 59 else 60 search(p,2*w); 61 } 62 int main() 63 { 64 int i,j,n,m,t,q,a,b,c,o = 0; 65 char d; 66 scanf("%d", &t); 67 while(t--) 68 { 69 o++; 70 getchar(); 71 memset(num,0,sizeof(num)); 72 gets(c1); 73 gets(c2); 74 int k1 = strlen(c1); 75 int k2 = strlen(c2); 76 if(k1>k2) 77 k = k2; 78 else 79 k = k1; 80 for(i = 0 ; i < k ;i++) 81 { 82 if(c1[i]!=c2[i]) 83 num[i+1] = 0; 84 else 85 num[i+1] = 1; 86 } 87 ctree(1,N,1); 88 scanf("%d", &q); 89 printf("Case %d:\n",o); 90 while(q--) 91 { 92 scanf("%d", &a); 93 if(a==2) 94 { 95 scanf("%d", &b); 96 if(num[b+1]==0) 97 { 98 printf("0\n"); 99 continue; 100 } 101 re = 0; 102 search(b+1,1); 103 printf("%d\n",re); 104 } 105 else 106 { 107 scanf("%d %d %c", &b,&c,&d); 108 if(c1[c]==c2[c]) 109 { 110 if(b==1) 111 c1[c] = d; 112 else 113 c2[c] = d; 114 if(c1[c]!=c2[c]) 115 { 116 num[c+1] = 0; 117 add(c+1,1,-1); 118 } 119 } 120 else 121 { 122 if(b==1) 123 c1[c] = d; 124 else 125 c2[c] = d; 126 if(c1[c]==c2[c]) 127 { 128 num[c+1] = 1; 129 add(c+1,1,1); 130 } 131 } 132 } 133 } 134 } 135 return 0; 136 }