求证NOIP T1
  • 板块学术版
  • 楼主Chenyj29
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/30 21:36
  • 上次更新2024/12/1 00:49:49
查看原帖
求证NOIP T1
455994
Chenyj29楼主2024/11/30 21:36

RT,贪心匹配.

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[2][N],b[2][N],sz1,sz2,bel[2][N],cnt[2][2][N];
signed main(){
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        sz1=sz2=0;
        for(int i=1;i<=n;++i){
            scanf("%1d",&a[0][i]);
        }
        for(int i=1;i<=n;++i){
            scanf("%1d",&a[1][i]);
        }
        for(int i=1;i<=n;++i){
            scanf("%1d",&b[0][i]);
            if(!b[0][i]||b[0][i]!=b[0][i-1])++sz1;
            bel[0][i]=sz1;
            ++cnt[0][a[0][i]][sz1];
//            cerr<<i<<" "<<sz1<<endl;
        }
        int ans=0;
        for(int i=1;i<=n;++i){
            scanf("%1d",&b[1][i]);
    		if(!b[1][i]||b[1][i]!=b[1][i-1])++sz2;
            bel[1][i]=sz2;
            ++cnt[1][a[1][i]][sz2];
//            cerr<<i<<" "<<sz2<<endl;
        }
        for(int i=1;i<=n;++i){
            if(cnt[0][0][bel[0][i]]&&cnt[1][0][bel[1][i]])--cnt[0][0][bel[0][i]],--cnt[1][0][bel[1][i]],++ans;
            else if(cnt[0][1][bel[0][i]]&&cnt[1][1][bel[1][i]])--cnt[0][1][bel[0][i]],--cnt[1][1][bel[1][i]],++ans;
            else if(cnt[0][0][bel[0][i]])--cnt[0][0][bel[0][i]],--cnt[1][1][bel[1][i]];
            else --cnt[0][1][bel[0][i]],--cnt[1][0][bel[1][i]];
        }
        printf("%d\n",ans);
    }
    return 0;
}

2024/11/30 21:36
加载中...