rt
代码是假的,思路源于我贪心写假了之后发现多贪几遍可以大概率得到正确答案,差不多1e8的复杂度
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],b[N],lima[N],limb[N];
void swa (int &a,int &b)
{
int c=a;
a=b,b=c;
}
void dg (int s,int n)
{
if(s>100) return ;
for(int i=1;i<n;i++)
{
if(a[i]!=b[i])
{
if(lima[i]&&lima[i+1]&&a[i+1]==b[i]) swa(a[i+1],a[i]);
if(limb[i]&&limb[i+1]&&b[i+1]==a[i]) swa(b[i],b[i+1]);
}
}
for(int i=n;i>1;i--)
{
if(a[i]!=b[i])
{
if(lima[i]&&lima[i-1]&&a[i-1]==b[i]) swa(a[i-1],a[i]);
if(limb[i]&&limb[i-1]&&b[i-1]==a[i]) swa(b[i],b[i-1]);
}
}
dg(s+1,n);
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%1d",&a[i]);
for(int i=1;i<=n;i++) scanf("%1d",&b[i]);
for(int i=1;i<=n;i++) scanf("%1d",&lima[i]);
for(int i=1;i<=n;i++) scanf("%1d",&limb[i]);
dg(1,n);
int ans=0;
for(int i=1;i<=n;i++)
ans+=(a[i]==b[i]);
printf("%d\n",ans);
}
return 0;
}