贪心做,二分判断第一个可以交换的位置,怎么挂了?
二分只分了一半,因为过不了大样例
而且小数据没挂,大数据挂了
我调了快7个小时了,想紫砂
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T,p=0;
int n,ans;
char s1[N],s2[N],t1[N],t2[N];
int pos_s1[N],pos_s2[N],pos_s3[N],pos_s4[N],pos_t1[N],pos_t2[N];
int cnt1,cnt2,cnt3,cnt4,cnt5,cnt6;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
freopen("edit2.in","r",stdin);
cin>>T;
while(T--){
ans=cnt1=cnt2=cnt3=cnt4=cnt5=cnt6=0;
cin>>n;
cin>>s1+1>>s2+1>>t1+1>>t2+1;
for(int i=1;i<=n;i++){
if(s1[i]=='0') pos_s1[++cnt1]=i;
if(s1[i]=='1') pos_s2[++cnt2]=i;
if(s2[i]=='0') pos_s3[++cnt3]=i;
if(s2[i]=='1') pos_s4[++cnt4]=i;
if(t1[i]=='0') pos_t1[++cnt5]=i;
if(t2[i]=='0') pos_t2[++cnt6]=i;
}
pos_t1[++cnt5]=pos_t2[++cnt6]=n+1;
for(int i=1;i<=n;i++){
//cout<<s1+1<<endl;
//cout<<s2+1<<endl;
//cout<<endl;
if(s1[i]==s2[i]) continue;
else if(s1[i]!=s2[i]){
if(t1[i]=='1'){
int k1=upper_bound(pos_s1+1,pos_s1+cnt1+1,i)-pos_s1;
int k2=upper_bound(pos_s2+1,pos_s2+cnt2+1,i)-pos_s2;
int r1=pos_s1[k1];
int r2=pos_s2[k2];
int c1=upper_bound(pos_t1+1,pos_t1+cnt5+1,i)-pos_t1;
c1=pos_t1[c1];
if(s1[i]=='1'){
if(k1<=cnt1&&r1<c1) swap(s1[i],s1[r1]);
}
else if(s1[i]=='0'){
if(k2<=cnt2&&r2<c1) swap(s1[i],s1[r2]);
}
}
if(t2[i]=='1'&&s1[i]!=s2[i]){
for(int j=i+1;j<=n;j++){
if(t2[j]=='0') break;
if(s2[j]==s1[i]){
swap(s2[j],s2[i]);
break;
}
}
}
}
}
for(int i=1;i<=n;i++){
if(s1[i]==s2[i]) ans++;
}
cout<<ans<<endl;
}
return 0;
}