#include #define pii pair #define fi first #define se second using namespace std; const int Max=3e5+5; int p[Max][2]; int op[Max][2]; int getc() { char c=getchar(); while(c!='0' and c!='1') c=getchar(); return c-'0'; } int n; struct edge{ int l,r,c[2]; edge() {l=r=c[0]=c[1]=0;} edge(int LL,int rr,int c00,int c11) {l=LL;r=rr;c[0]=c00;c[1]=c11;} }; vector g[2]; int merge(edge A,edge B) { int ans=min(A.r,B.r)-max(A.l,B.l)+1; return max(ans,0); } void solve() { g[0].clear();g[1].clear(); int ans=0; for(int i=1;i<=n;i++) if(op[i][0]==op[i][1] and op[i][0]==0 and p[i][0]==p[i][1]) ans++; for(int i=1;i<=n;i++) { if(op[i][0]==1) { int now=i; while(now+1<=n and op[now+1][0]==1) now++; edge ad(i,now,0,0); for(int j=i;j<=now;j++) ad.c[p[j][0]]++; i=now; g[0].push_back(ad); } } for(int i=1;i<=n;i++) { if(op[i][1]==1) { int now=i; while(now+1<=n and op[now+1][1]==1) now++; edge ad(i,now,0,0); for(int j=i;j<=now;j++) ad.c[p[j][1]]++; i=now; g[1].push_back(ad); } } int h1=0,h2=0; for(int j=0;j<=(int)g[0].size()-1;j++) { for(int i=g[0][j].l;i<=g[0][j].r;i++) { if(op[i][1]==0) { if(g[0][j].c[p[i][1]]) { g[0][j].c[p[i][1]]--; ans++; } else { g[0][j].c[p[i][1]^1]--; } } } } for(int j=0;j<=(int)g[1].size()-1;j++) { for(int i=g[1][j].l;i<=g[1][j].r;i++) { if(op[i][0]==0) { if(g[1][j].c[p[i][0]]) { g[1][j].c[p[i][0]]--; ans++; } else { g[1][j].c[p[i][0]^1]--; } } } } if(!g[0].size() or !g[1].size()) { printf("%d\n",ans); return ; } for(int k=1;k<=(int)(g[0].size()+g[1].size()-1);k++) { if(merge(g[0][h1],g[1][h2])) { int m1=min(g[0][h1].c[0],g[1][h2].c[0]); g[0][h1].c[0]-=m1; g[1][h2].c[0]-=m1; ans+=m1; int m2=min(g[0][h1].c[1],g[1][h2].c[1]); g[0][h1].c[1]-=m2; g[1][h2].c[1]-=m2; ans+=m2; if(g[0][h1].r<=g[1][h2].r) { g[1][h2].c[0]-=g[0][h1].c[1]; g[1][h2].c[1]-=g[0][h1].c[0]; } else { g[0][h1].c[0]-=g[1][h2].c[1]; g[0][h1].c[1]-=g[1][h2].c[0]; } } if(h1==(int)g[0].size()-1) h2++; else if(h2==(int)g[1].size()-1) h1++; else if(g[0][h1+1].l<=g[1][h2+1].l) h1++; else h2++; } printf("%d\n",ans); } #define fp_on signed main() { #ifdef fp_on freopen("edit.in","r",stdin); freopen("edit.out","w",stdout); #endif // fp_on int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++)p[i][0]=getc(); for(int i=1;i<=n;i++)p[i][1]=getc(); for(int i=1;i<=n;i++)op[i][0]=getc(); for(int i=1;i<=n;i++)op[i][1]=getc(); solve(); } }