如代码,想法是分段,段内匹配。
其中后半部分代码均为复制粘贴。
#include<bits/stdc++.h>
int read(){int x=0,w=1;char ch=0;while(ch<'0' || ch>'9'){ch=getchar();if(ch=='-') w=-1;}while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*w;}
const int KI=2e5+1;
bool vis1[KI],vis2[KI];
int cnt1[KI][2],cnt2[KI][2];
void solve()
{
memset(vis1,0,sizeof vis1);memset(vis2,0,sizeof vis2);
memset(cnt1,0,sizeof cnt1);memset(cnt2,0,sizeof cnt2);
int n=read();
std::string s1,s2,s3,s4;
std::cin>>s1>>s2>>s3>>s4;
if(s1==s2)
{
std::cout<<n<<'\n';
return ;
}
for(int i=0;i<n;i++) if(s3[i]=='0') vis1[i]=1;
for(int i=0;i<n;i++) if(s4[i]=='0') vis2[i]=1;
std::vector<std::pair<int,int> >vec1;
std::vector<std::pair<int,int> >vec2;
vis1[n]=1;vis2[n]=1;
int lst1=0,lst2=0;
for(int i=0;i<=n;i++)
{
if(vis1[i])
{
vec1.push_back(std::make_pair(lst1+1,i+1));
lst1=i+1;
}
if(vis2[i])
{
vec2.push_back(std::make_pair(lst2+1,i+1));
lst2=i+1;
}
}
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
if(s1[j-1]=='0') cnt1[i][0]++;
if(s1[j-1]=='1') cnt1[i][1]++;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
if(s2[j-1]=='0') cnt2[i][0]++;
if(s2[j-1]=='1') cnt2[i][1]++;
}
}
if(s3==s4)
{
int anx=0;
for(int i=0;i<vec2.size();i++) anx+=(std::min(cnt1[i][0],cnt2[i][0])+std::min(cnt1[i][1],cnt2[i][1]));
for(int i=1;i<=n;i++) if(s3[i-1]=='0') if(s1[i-1]==s2[i-1]) anx++;
std::cout<<anx<<'\n';
return ;
}
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
int x=s2[j-1]-'0';
if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
int x=s1[j-1]-'0';
if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
}
}
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
if(s1[j-1]=='0') cnt1[i][0]++;
if(s1[j-1]=='1') cnt1[i][1]++;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
if(s2[j-1]=='0') cnt2[i][0]++;
if(s2[j-1]=='1') cnt2[i][1]++;
}
}
//复制粘贴开始
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
int x=s2[j-1]-'0';
if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
int x=s1[j-1]-'0';
if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
}
}
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
if(s1[j-1]=='0') cnt1[i][0]++;
if(s1[j-1]=='1') cnt1[i][1]++;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
if(s2[j-1]=='0') cnt2[i][0]++;
if(s2[j-1]=='1') cnt2[i][1]++;
}
}
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
int x=s2[j-1]-'0';
if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
int x=s1[j-1]-'0';
if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
}
}
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
if(s1[j-1]=='0') cnt1[i][0]++;
if(s1[j-1]=='1') cnt1[i][1]++;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
if(s2[j-1]=='0') cnt2[i][0]++;
if(s2[j-1]=='1') cnt2[i][1]++;
}
}
for(int i=0;i<vec1.size();i++)
{
for(int j=vec1[i].first;j<vec1[i].second;j++)
{
int x=s2[j-1]-'0';
if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
}
}
for(int i=0;i<vec2.size();i++)
{
for(int j=vec2[i].first;j<vec2[i].second;j++)
{
int x=s1[j-1]-'0';
if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
}
}
// std::cout<<s1<<' '<<s2<<'\n';
int ans=0;
for(int i=0;i<n;i++) if(s1[i]==s2[i]) ans++;
std::cout<<ans<<'\n';
}
/*
1
6
110010
010101
000011
111001
*/
signed main()
{
int T=read();
while(T--) solve();
}