这啥民间数据
查看原帖
这啥民间数据
761125
Milthm楼主2024/12/1 13:08

我打了个特殊性质 B,他把 C 的一半分也给我了(

#include<bits/stdc++.h>
using namespace std;
int T,n;
string s,s2,t,t2;
signed main(){
	cin>>T;
	while(T--){
		cin>>n>>s>>s2>>t>>t2;int f=1,ans=0;
		if(n<=10){
			for(int i=1;i<=1e5;++i){
				int u=rand()%n,v=rand()%2,d=rand()%2;
				if(d){
					if(v&&u>0&&t[u-1]=='1'&&t[u]=='1')swap(s[u],s[u-1]);
					if(!v&&u<n-1&&t[u+1]=='1'&&t[u]=='1')swap(s[u],s[u+1]);
				}
				else{
					if(v&&u>0&&t2[u-1]=='1'&&t2[u]=='1')swap(s2[u],s2[u-1]);
					if(!v&&u<n-1&&t2[u+1]=='1'&&t2[u]=='1')swap(s2[u],s2[u+1]);
				}
				int cnt=0;
				for(int j=0;j<n;++j)cnt+=(s[j]==s2[j]);
				ans=max(ans,cnt);
			}
			cout<<ans<<'\n';continue;
		}
		for(int i=0;i<n;++i){
			if(s[i]!=s[0])f=0;
			if(s[i]==s2[i])++ans;
		}
		if(f)cout<<ans<<'\n';
		else{
			ans=0;int scnt0=0,scnt1=0,s2cnt0=0,s2cnt1=0;
			for(int i=0;i<n;++i){
				if(t[i]=='0'||t2[i]=='0')ans+=min(scnt0,s2cnt0)+min(scnt1,s2cnt1)+(s[i]==s2[i]),scnt0=s2cnt0=scnt1=s2cnt1=0;
				else{
					if(s[i]=='0')++scnt0;
					else ++scnt1;
					if(s2[i]=='0')++s2cnt0;
					else ++s2cnt1;
				}
			}
			ans+=min(scnt0,s2cnt0)+min(scnt1,s2cnt1);
			cout<<ans<<'\n';
		}
	}
	return 0;
}
2024/12/1 13:08
加载中...