#include<bits/stdc++.h>
using namespace std;//dc
long long T,n,a[400000],b[400000],t1[400000],t2[400000],ans,cnt1,tmp1,na,cnt2,tmp2,nb;
char rp;
struct node{
long long l,r,num,ys;
}g1[400000],g2[400000];
long long findd1(long long pl){
for(long long i=1;i<=cnt1;i++)
if((g1[i].l<=pl)&&(g1[i].r>=pl)) return i;
return 0;
}
long long findd2(long long pl){
for(long long i=1;i<=cnt2;i++)
if((g2[i].l<=pl)&&(g2[i].r>=pl)) return i;
return 0;
}
long long mian(){
ans=cnt1=tmp1=na=cnt2=tmp2=nb=0;
for(long long i=0;i<=399999;i++){
a[i]=b[i]=t1[i]=t2[i]=0;
g1[i].l=g1[i].r=g1[i].num=g1[i].ys=0;
g2[i].l=g2[i].r=g2[i].num=g2[i].ys=0;
}
cin>>n;
for(long long i=1;i<=n;i++){
cin>>rp;
if(rp=='1') a[i]=1;
else a[i]=0;
}
for(long long i=1;i<=n;i++){
cin>>rp;
if(rp=='1') b[i]=1;
else b[i]=0;
}
for(long long i=1;i<=n;i++){
cin>>rp;
if(rp=='1') t1[i]=1;
else t1[i]=0;
}
for(long long i=1;i<=n;i++){
cin>>rp;
if(rp=='1') t2[i]=1;
else t2[i]=0;
}
for(long long i=1;i<=n;i++){
if((t1[i-1]==0)&&(t1[i+1]==0)) t1[i]=0;
if((t2[i-1]==0)&&(t2[i+1]==0)) t2[i]=0;
}
for(long long i=1;i<=(n+1);i++){//ji de kai da shu zu
if(t1[i]==1){
tmp1++;
if(a[i]==1) na++;
}
else {
if(tmp1!=0){
g1[++cnt1].l=(i-tmp1);
g1[cnt1].r=(i-1);
g1[cnt1].num=na;
g1[cnt1].ys=tmp1;
tmp1=0;na=0;
}
}
//
if(t2[i]==1){
tmp2++;
if(b[i]==1) nb++;
}
else {
if(tmp2!=0){
g2[++cnt2].l=(i-tmp2);
g2[cnt2].r=(i-1);
g2[cnt2].num=nb;
g2[cnt2].ys=tmp2;
tmp2=0;nb=0;
}
}
}
for(long long i=1;i<=n;i++){
if((t1[i]==0)&&(t2[i]==0)){
if(a[i]==b[i]) ans++;
continue;
}
if((t1[i]==1)&&(t2[i]==1)) continue;
if((t1[i]==1)&&(t2[i]==0)){
long long qp=findd1(i);
if(b[i]==1){
if(g1[qp].num>=1) ans++,g1[qp].num--;
g1[qp].ys--;
continue;
}
else {
if((g1[qp].ys-g1[qp].num)>=1) ans++;
else g1[qp].num--;
g1[qp].ys--;
continue;
}
}
if((t1[i]==0)&&(t2[i]==1)){
long long qp=findd2(i);
if(a[i]==1){
if(g2[qp].num>=1) ans++,g2[qp].num--;
g2[qp].ys--;
continue;
}
else {
if((g2[qp].ys-g2[qp].num)>=1) ans++;
else g2[qp].num--;
g2[qp].ys--;
continue;
}
}
}
bool endtime=1;
long long pl1=1,pl2=1;
while(endtime){
if((pl1>=cnt1)&&(g1[pl1].ys==0)&&(pl2>=cnt2)&&(g2[pl2].ys==0)){
endtime=0;
continue;
}
if(g1[pl1].ys>=g2[pl2].ys){
long long d0=min((g2[pl2].ys-g2[pl2].num),(g1[pl1].ys-g1[pl1].num));
long long d1=min(g2[pl2].num,g1[pl1].num);
ans+=d0+d1;
g1[pl1].ys-=g2[pl2].ys;
if(d0<(g2[pl2].ys-g2[pl2].num)) g1[pl1].num-=(g2[pl2].ys-d0);
else g1[pl1].num-=d1;
g2[pl2].num=0;g2[pl2].ys=0;
pl2++;
continue;
}
else {
long long d0=min((g2[pl2].ys-g2[pl2].num),(g1[pl1].ys-g1[pl1].num));
long long d1=min(g2[pl2].num,g1[pl1].num);
ans+=d0+d1;
g2[pl2].ys-=g1[pl1].ys;
if(d0<(g1[pl1].ys-g1[pl1].num)) g2[pl2].num-=(g1[pl1].ys-d0);
else g2[pl2].num-=d1;
g1[pl1].num=0;g1[pl1].ys=0;
pl1++;
continue;
}
}
cout<<ans<<endl;
return 0;
}
int main(){
//freopen("edit.in","r",stdin);
//freopen("edit.out","w",stdout);
cin>>T;
for(long long i=1;i<=T;i++) mian();
return 0;
}
拿到代码后把数组开到2e6还是WA,不会了,