史山代码求hack
查看原帖
史山代码求hack
890257
CarlosProvo楼主2024/12/1 12:40

rt(去freopen)

#include<bits/stdc++.h>
#define rep(i,m,n) for(int i=m;i<=n;i++)
#define mem(s,t) memset(s,t,sizeof s)
using namespace std;
const int N=1e5+5;
string s1,s2,t1,t2;
int from1[N],from2[N],cnt1[N][2],cnt2[N][2],n,t,tot1,tot2,flag1,flag2,ans;
void solve()
{
    cin>>n>>s1>>s2>>t1>>t2;
    tot1=tot2=flag1=flag2=ans=0,mem(from1,0),mem(from2,0),mem(cnt1,0),mem(cnt2,0);
    rep(i,0,n-1)
    {
        if(t1[i]=='1')
        {
            if(!flag1)tot1++,flag1=1;
            from1[i]=tot1;
            if(s1[i]=='0')cnt1[from1[i]][0]++;
            else cnt1[from1[i]][1]++;
        }
        else if(t1[i]=='0')flag1=0;
        if(t2[i]=='1')
        {
            if(!flag2)tot2++,flag2=1;
            from2[i]=tot2;
            if(s2[i]=='0')cnt2[from2[i]][0]++;
            else cnt2[from2[i]][1]++;
        }
        else if(t2[i]=='0')flag2=0;
    }
    // rep(i,0,n-1)cout<<from1[i]<<" ";
    // cout<<endl;
    // rep(i,0,n-1)cout<<from2[i]<<" ";
    // cout<<endl;
    // rep(i,1,tot1)cout<<cnt1[i][0]<<" ";
    // cout<<endl;
    // rep(i,1,tot1)cout<<cnt1[i][1]<<" ";
    // cout<<endl;
    // rep(i,1,tot2)cout<<cnt2[i][0]<<" ";
    // cout<<endl;
    // rep(i,1,tot2)cout<<cnt2[i][1]<<" ";
    // cout<<endl;
    rep(i,0,n-1)
    {
        if(t1[i]=='0'&&t2[i]=='0')
        {
            if(s1[i]==s2[i])ans++;
            // cout<<"00 "<<s1[i]<<" "<<s2[i]<<endl;
        }
        else if(t1[i]=='1'&&t2[i]=='0')
        {
            // cout<<"10 "<<s2[i]<<" "<<cnt1[from1[i]][0]<<" "<<cnt1[from1[i]][1]<<endl;
            if(s2[i]=='0'&&cnt1[from1[i]][0])cnt1[from1[i]][0]--,ans++;
            else if(s2[i]=='1'&&cnt1[from1[i]][1])cnt1[from1[i]][1]--,ans++;
            else if(cnt1[from1[i]][0]>=cnt1[from1[i]][1])cnt1[from1[i]][0]--;
            else cnt1[from1[i]][1]--;
            // cout<<ans<<endl;
        }
        else if(t1[i]=='0'&&t2[i]=='1')
        {
            // cout<<"01 "<<s1[i]<<" "<<cnt2[from2[i]][0]<<" "<<cnt2[from2[i]][1]<<endl;
            if(s1[i]=='0'&&cnt2[from2[i]][0])cnt2[from2[i]][0]--,ans++;
            else if(s1[i]=='1'&&cnt2[from2[i]][1])cnt2[from2[i]][1]--,ans++;
            else if(cnt2[from2[i]][0]>=cnt2[from2[i]][1])cnt2[from2[i]][0]--;
            else cnt2[from2[i]][1]--;
            // cout<<ans<<endl;
        }
        else if(t1[i]=='1'&&t2[i]=='1')
        {
            // cout<<"11 "<<cnt1[from1[i]][0]<<" "<<cnt2[from2[i]][0]<<" "<<cnt1[from1[i]][1]<<" "<<cnt2[from2[i]][1]<<endl;
            if(min(cnt1[from1[i]][0],cnt2[from2[i]][0])>=min(cnt1[from1[i]][1],cnt2[from2[i]][1])&&min(cnt1[from1[i]][0],cnt2[from2[i]][0]))cnt1[from1[i]][0]--,cnt2[from2[i]][0]--,ans++;
            else if(min(cnt1[from1[i]][0],cnt2[from2[i]][0])<min(cnt1[from1[i]][1],cnt2[from2[i]][1])&&min(cnt1[from1[i]][1],cnt2[from2[i]][1]))cnt1[from1[i]][1]--,cnt2[from2[i]][1]--,ans++;
            // cout<<ans<<endl;
        }
    }
    cout<<ans<<endl;
}
int main()
{
    cin>>t;
    while(t--)solve();
    return 0;
}
2024/12/1 12:40
加载中...