65分求调
查看原帖
65分求调
1123721
lishunjie楼主2024/12/9 20:59
//杉月
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int t,n;
int s1[N],s2[N];
int st1[N],top1;
int st2[N],top2;
int tA=1,tB=1;
void read(){
		char ss;
		for(int i=1;i<=n;i++){
			cin>>ss;
			s1[i]=ss-'0';
			if(i>1&&s1[i]!=s1[i-1]) tA=0;
		}
		for(int i=1;i<=n;i++){
			cin>>ss;
			s2[i]=ss-'0';
		}	
		for(int i=1;i<=n;i++){
			cin>>ss;
			if(ss=='0'){
				st1[++top1]=i;
			}
		}
		for(int i=1;i<=n;i++){
			cin>>ss;
			if(ss=='0'){
				st2[++top2]=i;
			}		
		}
		if(top1!=top2){
			tB=0;
		}else{
		for(int i=1;i<=top1;i++){
			if(st1[i]!=st2[i]) tB=0;
		}
		}
}
int solveA(){
	int ans=0;
	for(int i=1;i<=n;i++){
		if(s1[i]==s2[i]) ans++;
	}
	return ans;
}
int solveB(){
	int num1=0,num2=0,ans=0;
	int j=1;
	while(j<=top1){
		for(int i=st1[j-1]+1;i<st1[j];i++){
			if(s1[i]==1) num1++;
		}
		for(int i=st2[j-1]+1;i<st2[j];i++){
			if(s2[i]==1) num2++;
		}
		
		if(s1[st1[j]]==s2[st2[j]]&&j<top1) ans++;
		int ss1=(st1[j]-st1[j-1])-1-num1;
		int ss2=(st2[j]-st2[j-1])-1-num2;		
		ans+=min(num1,num2)+min(ss1,ss2);
		num1=0;num2=0;j++;
	}
	
	return ans;
}
int solve(){
	int ans=0;
	int num1=0,num2=0;
	int i=1,j=1;
		for(int i1=st1[i-1]+1;i1<st1[i];i1++){
			if(s1[i1]==1) num1++;
		}
		
		for(int i1=st2[j-1]+1;i1<st2[j];i1++){
			if(s2[i1]==1) num2++;
		}
		//cout<<num1<<" "<<num2<<endl;
	while(i<=top1||j<=top2){
		if(st1[i]==st2[j]){
			//if(i==top1&&j==top2) break;
			if(s1[st1[i]]==s2[st2[j]]&&i<top1&&j<top2) ans++;
			    num1=min(st1[i]-max(st1[i-1],st2[j-1])-1,num1);
			    num2=min(st2[j]-max(st1[i-1],st2[j-1])-1,num2);
				int ss1=(st1[i]-max(st1[i-1],st2[j-1]))-1-num1;
				int ss2=(st2[j]-max(st1[i-1],st2[j-1]))-1-num2;
				ans+=min(num1,num2)+min(ss1,ss2);
				num1=num2=0;i++;j++;
		        for(int i1=st2[j-1]+1;i1<st2[j];i1++){
			       if(s2[i1]==1) num2++;
		        }
	          	for(int i1=st1[i-1]+1;i1<st1[i];i1++){
		           if(s1[i1]==1) num1++;
		        }		
		}else{
			if(st1[i]>st2[j]){
				if(s2[st2[j]]==1&&j<top2) num2++;
			    num1=min(st1[i]-max(st1[i-1],st2[j-1])-1,num1);
			    num2=min(st2[j]-max(st1[i-1],st2[j-1]),num2);
				int ss1=(st1[i]-max(st1[i-1],st2[j-1]))-1-num1;
				int ss2=(st2[j]-max(st1[i-1],st2[j-1]))-num2;
				ans+=min(num1,num2)+min(ss1,ss2);
				num1-=min(num1,num2);
				num2=0;j++;
		        for(int i1=st2[j-1]+1;i1<st2[j];i1++){
			       if(s2[i1]==1) num2++;
		        }
				
			}
			else{
				if(s1[st1[i]]==1&&i<top1) num1++;
			    num1=min(st1[i]-max(st1[i-1],st2[j-1]),num1);
			    num2=min(st2[j]-max(st1[i-1],st2[j-1])-1,num2);				
				int ss1=(st1[i]-max(st1[i-1],st2[j-1]))-num1;
				int ss2=(st2[j]-max(st1[i-1],st2[j-1]))-1-num2;			
				ans+=min(num1,num2)+min(ss1,ss2);
				num2-=min(num1,num2);
				num1=0;i++;
	          	for(int i1=st1[i-1]+1;i1<st1[i];i1++){
		           if(s1[i1]==1) num1++;
		        }				
			}
		}
		//cout<<ans<<endl;
	}
	return ans;
}

int main(){
	//freopen("edit17.in","r",stdin);
	//freopen("edit17.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie();cout.tie();
	cin>>t;
	while(t--){
		cin>>n;
		top1=top2=0;
		tA=1,tB=1;
        read();
       	st1[++top1]=n+1;
	    st2[++top2]=n+1;
        if(tA) {cout<<solveA()<<endl;continue;}	
		if(tB) {cout<<solveB()<<endl;continue;}
        if(top1==1&&top2==1){
        	int uu1=0,uu2=0;
        	for(int i=1;i<=n;i++){
        		if(s1[i]==1) uu1++;
        		if(s2[i]==1) uu2++;
			}
			cout<<n-abs(uu1-uu2)<<endl;continue;}
			
	    cout<<solve()<<endl;
		}
	
	return 0; 
}

solveA是解决性质A的solveB同理,大佬只用看solve函数就行了。

2024/12/9 20:59
加载中...