救救孩子吧
#include<bits/stdc++.h>
using namespace std;
#define ToMaT for(int i=1;i<=n;++i)
#define totoe for(int j=1;j<=n;++j)
int main(){
int T;//有T组数据
cin>>T;
while(T--){
int n;//元素个数
cin>>n;
string s,s1,s2,s3;//先输入4个字符串
cin>>s>>s1>>s2>>s3;
bool a[100001],b[100001],c[100001],d[100001];//a,b:记录每个数字 c,d:标记是否能交换
ToMaT{
a[i]=bool(s[i-1]-'0');
}//将s复制到a
ToMaT{
b[i]=bool(s1[i-1]-'0');
}//将s1复制到b
ToMaT{
c[i]=bool(s2[i-1]-'0');
}//将s2复制到c
ToMaT{
d[i]=bool(s3[i-1]-'0');
}//将s3复制到d
int cnt=0;//记录答案
ToMaT{
if(a[i]==b[i]){
c[i]=0;
d[i]=0;
cnt+=2;
}//如果a[i]已经等于b[i],那么就不能修改了,标记为0,添加一对数字,答案加2
}
ToMaT{
if(a[i]=b[i]&&(a[i]==1||b[i]==1)){
cnt+=2;
c[i]=0;
d[i]=0;
}//新交换出的
if(c[i]==0&&d[i]==0){//都不能交换
//a[i],b[i]没有价值
}
else if(c[i]==0&&d[i]==1){//只能交换d(b)
if(i==1){//避免RE
if(d[2]==1&&b[2]==a[1]){//如果b[2]可交换且刚好与a[1]相等那么就交换b[2],b[1]
swap(b[2],b[1]);
cnt+=2;
}
}
else if(i==n){//避免RE
if(d[n-1]==1&&b[n-1]==a[n]){//如果b[n-1]可交换且刚好与a[n]相等那么就交换b[n],b[n-1]
swap(b[n],b[n-1]);
cnt+=2;
}
}
else{
if(d[i-1]==1&&b[i-1]==a[i]){//如果b[i]的前一个与a[i]相等且可交换那么就优先交换前一个,即b[i-1]与b[i]
swap(b[i-1],b[i]);
cnt+=2;
}
else if(d[i+1]==1&&b[i+1]==a[i]){//如果b[i]的后一个与a[i]相等且可交换那么就交换后一个,即b[i+1]与b[i]
swap(b[i+1],b[i]);
cnt+=2;
}
else{
//如果怎么交换都不行那么就不管它了
}
}
}
else if(c[i]==1&&d[i]==0){//只能交换c(a)
if(i==1){//避免RE
if(c[2]==1&&a[2]==b[1]){//如果a[2]可交换且刚好与b[1]相等那么就交换a[2],a[1]
swap(a[2],a[1]);
cnt+=2;
}
}
else if(i==n){//避免RE
if(c[n-1]==1&&a[n-1]==b[n]){//如果a[n-1]可交换且刚好与b[n]相等那么就交换a[n],a[n-1]
swap(a[n],a[n-1]);
cnt+=2;
}
}
else{
if(c[i-1]==1&&a[i-1]==b[i]){//如果a[i]的前一个与b[i]相等且可交换那么就优先交换前一个,即a[i-1]与a[i]
swap(a[i-1],a[i]);
cnt+=2;
}
else if(c[i+1]==1&&a[i+1]==b[i]){//如果a[i]的后一个与b[i]相等且可交换那么就交换后一个,即a[i+1]与a[i]
swap(a[i+1],a[i]);
cnt+=2;
}
else{
//如果怎么交换都不行那么就不管它了
}
}
}
else{//都可以交换
if(i==1){//避免RE
if(c[2]==1&&a[2]==b[1]){//如果a[2]可交换且刚好与b[1]相等那么就交换a[2],a[1]
swap(a[2],a[1]);
cnt+=2;
continue;
}
}
else if(i==n){//避免RE
if(c[n-1]==1&&a[n-1]==b[n]){//如果a[n-1]可交换且刚好与b[n]相等那么就交换a[n],a[n-1]
swap(a[n],a[n-1]);
cnt+=2;
continue;
}
}
else{
if(c[i-1]==1&&a[i-1]==b[i]){//如果a[i]的前一个与b[i]相等且可交换那么就优先交换前一个,即a[i-1]与a[i]
swap(a[i-1],a[i]);
cnt+=2;
continue;
}
else if(c[i+1]==1&&a[i+1]==b[i]){//如果a[i]的后一个与b[i]相等且可交换那么就交换后一个,即a[i+1]与a[i]
swap(a[i+1],a[i]);
cnt+=2;
continue;
}
else{
//如果怎么交换都不行那么就不管它了
}
}
if(i==1){//避免RE
if(c[2]==1&&a[2]==b[1]){//如果a[2]可交换且刚好与b[1]相等那么就交换a[2],a[1]
swap(a[2],a[1]);
cnt+=2;
continue;
}
}
else if(i==n){//避免RE
if(c[n-1]==1&&a[n-1]==b[n]){//如果a[n-1]可交换且刚好与b[n]相等那么就交换a[n],a[n-1]
swap(a[n],a[n-1]);
cnt+=2;
continue;
}
}
else{
if(c[i-1]==1&&a[i-1]==b[i]){//如果a[i]的前一个与b[i]相等且可交换那么就优先交换前一个,即a[i-1]与a[i]
swap(a[i-1],a[i]);
cnt+=2;
continue;
}
else if(c[i+1]==1&&a[i+1]==b[i]){//如果a[i]的后一个与b[i]相等且可交换那么就交换后一个,即a[i+1]与a[i]
swap(a[i+1],a[i]);
cnt+=2;
continue;
}
else{
//如果怎么交换都不行那么就不管它了
}
}
}
}
cout<<cnt<<endl;
}
return 0;
}