这代码正确吗
查看原帖
这代码正确吗
917301
xwx123456楼主2024/12/4 22:38
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int T,n,a1[N][2],a2[N][2],num1[N][2],num2[N][2],len1,len2;
string s1,s2,t1,t2;
void yu() {
	len1=len2=0;
	int t=0,tmp1=0,tmp2=0;
	t1+="0",t2+="0";
	for(int i=0; i<=n; i++) {
		if(t1[i]=='1') {
			t++;
			if(s1[i]=='1')tmp2++;
			else tmp1++;
		} else {
			if(t>1) {
				a1[++len1][0]=i-t,a1[len1][1]=i-1;
				num1[len1][0]=tmp1,num1[len1][1]=tmp2;
			}
			t=tmp1=tmp2=0;
		}
	}
	t=tmp1=tmp2=0;
	for(int i=0; i<=n; i++) {
		if(t2[i]=='1') {
			t++;
			if(s2[i]=='1')tmp2++;
			else tmp1++;
		} else {
			if(t>1) {
				a2[++len2][0]=i-t,a2[len2][1]=i-1;
				num2[len2][0]=tmp1,num2[len2][1]=tmp2;
			}
			t=tmp1=tmp2=0;
		}
	}
	a1[len1+1][0]=a2[len2+1][0]=N;
}
signed main() {
	ios::sync_with_stdio(false);
	cin>>T;
	while(T--) {
		cin>>n>>s1>>s2>>t1>>t2;
		yu();
		int sum=0,j1=0,j2=0;
		while(true) {
			if(j1>=len1&&j2>=len2)
				break;
			if(a1[j1+1][0]<=a2[j2+1][0]) {
				j1++;
				for(int i=a1[j1][0]; i<=a1[j1][1]; i++) {
					if(s2[i]=='1') {
						if(num1[j1][1])
							num1[j1][1]--,s1[i]='1';
						else
							num1[j1][0]--,s1[i]='0';
					} else {
						if(num1[j1][0])
							num1[j1][0]--,s1[i]='0';
						else
							num1[j1][1]--,s1[i]='1';
					}
				}
			} else {
				j2++;
				for(int i=a2[j2][0]; i<=a2[j2][1]; i++) {
					if(s1[i]=='1') {
						if(num2[j2][1])
							num2[j2][1]--,s2[i]='1';
						else
							num2[j2][0]--,s2[i]='0';
					} else {
						if(num2[j2][0])
							num2[j2][0]--,s2[i]='0';
						else
							num2[j2][1]--,s2[i]='1';
					}
				}
			}
		}
		for(int i=0; i<n; i++)
			if(s1[i]==s2[i])
				sum++;
		cout<<sum<<endl;
	}
	return 0;
}
2024/12/4 22:38
加载中...