60pts求调
查看原帖
60pts求调
1263684
Elysialr楼主2024/12/24 19:32
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define SIZE 1000001

struct block{
    ll l,r,n0,n1;
};
block new_block(ll l,ll r=0){
    block b;
    b.l=l;
    b.r=r;
    b.n0=0;
    b.n1=0;
    return b;
}

ll t,n;
string s1,s2,t1,t2;
vector<block> c1,c2;


int main(){
    //freopen("edit2.in","r",stdin);
    //freopen("edit2.out","w",stdout);
    cin>>t;
    while(t--){
        c1.clear();
        c2.clear();
        cin>>n;
        cin>>s1>>s2>>t1>>t2;
        s1='0'+s1+'0';
        s2='0'+s2+'0';
        t1='0'+t1+'0';
        t2='0'+t2+'0';

        for(ll i=1;i<=n;i++){
            if(t1[i]=='1'){
                if(t1[i-1]=='0') c1.push_back(new_block(i));
                if(t1[i+1]=='0') c1.back().r=i;
            }
            if(t2[i]=='1'){
                if(t2[i-1]=='0') c2.push_back(new_block(i));
                if(t2[i+1]=='0') c2.back().r=i;
            }
            if(t1[i]=='0') c1.push_back(new_block(i,i));
            if(t2[i]=='0') c2.push_back(new_block(i,i));
        }
        for(ll i=0;i<c1.size();i++)
        for(ll j=c1[i].l;j<=c1[i].r;j++)
        if(s1[j]=='0') c1[i].n0++;
        else c1[i].n1++;

        for(ll i=0;i<c2.size();i++)
        for(ll j=c2[i].l;j<=c2[i].r;j++)
        if(s2[j]=='0') c2[i].n0++;
        else c2[i].n1++;

        ll i1=0,i2=0,res=0;
        while(true){
            ll add0=min(c1[i1].n0,c2[i2].n0);
            ll add1=min(c1[i1].n1,c2[i2].n1);
            c1[i1].n0-=add0;
            c2[i2].n0-=add0;
            c1[i1].n1-=add1;
            c2[i2].n1-=add1;
            res+=add0+add1;

            if(c1[i1].r==c2[i2].r) i1++,i2++;
            else if(c2[i2].r>c1[i1].r) i1++;
            else if(c1[i1].r>c2[i2].r) i2++;
            if(i1>=c1.size()||i2>=c2.size()) break;
        }
        cout<<res<<'\n';
    }
    return 0;
}
2024/12/24 19:32
加载中...