题意:给定A,B长度相同的字符串,Q次操作,修改操作位单个字符修改,查询操作为询问从某点开始有多少连续相同的字符。
思路:我们把不相同的设为1,相同的设为0,那么询问就是找下一个为1的为位置,可以用线段树解决,可以用set的lower_bound解决,这里用bitset的Find_next函数,效率还可以。 关键是代码短,好写。
复杂度:相当于分块,块的大小为32,所以复杂度为O(L/32),L取决于下一个1的位置; 可以看讨论:http://codeforces.com/blog/entry/43718
#include<bits/stdc++.h> using namespace std; const int maxn=1000010; bitset<maxn>s; char a[maxn],b[maxn]; int main() { int T,N,Q,C=0,opt; scanf("%d",&T); while(T--){ scanf("%s%s",a+1,b+1); N=strlen(a+1); s.reset(); for(int i=1;i<=N;i++) if(a[i]!=b[i]) s[i]=1; s[N+1]=1; scanf("%d",&Q); printf("Case %d: ",++C); while(Q--){ scanf("%d",&opt); if(opt==1){ int w,pos; char c[3]; scanf("%d%d%s",&w,&pos,c); if(w==1) a[pos+1]=c[0]; else b[pos+1]=c[0]; if(a[pos+1]!=b[pos+1]) s[pos+1]=1; else s[pos+1]=0; } else { int pos; scanf("%d",&pos); int first=s._Find_next(pos); printf("%d ",first-pos-1); } } } return 0; }