#include<iostream> #include<cstdio> #include<cstring> #include<map> #include<set> using namespace std; const int maxn=1000009; int c[maxn]; char s1[maxn],s2[maxn]; struct bit { int lowbit(int x) { return x&-x; } void init() { memset(c,0,sizeof(c)); } int sum(int x) { int res=0; for(int i=x;i>0;i-=lowbit(i)) { res+=c[i]; } return res; } void add(int x,int a) { for(int i=x;i<maxn;i+=lowbit(i)) { c[i]+=a; } } }my; int get(int k) { int sum=my.sum(k-1); int l=k,r=maxn,mid; while(l<=r) { mid=(l+r)>>1; if(my.sum(mid)-sum==mid-k+1) { l=mid+1; } else { r=mid-1; } } return l-k; } int main() { int ca,id=0,op,k,f,n; char ch[2]; scanf("%d",&ca); while(ca--) { scanf("%s",s1+1); scanf("%s",s2+1); scanf("%d",&n); my.init(); printf("Case %d:\n",++id); int len1=strlen(s1+1); int len2=strlen(s2+1); int len=min(len1,len2); for(int i=1;i<=len;i++) { if(s1[i]==s2[i]) my.add(i,1); } for(int i=0;i<n;i++) { scanf("%d",&op); if(op==1) { scanf("%d%d%s",&k,&f,ch); int fg=s1[f+1]==s2[f+1]?1:0; if(k==1)s1[f+1]=ch[0]; else s2[f+1]=ch[0]; int fk=s1[f+1]==s2[f+1]?1:0; if(fg&&!fk) { my.add(f+1,-1); } else if(!fg&&fk) { my.add(f+1,1); } } else { scanf("%d",&k); printf("%d\n",get(k+1)); } } } }
HDU 4339 Query 树状数组
最新推荐文章于 2019-06-29 12:27:16 发布