求解这段代码正确性
查看原帖
求解这段代码正确性
855179
EL1ka楼主2025/6/12 21:58

如代码,想法是分段,段内匹配。

其中后半部分代码均为复制粘贴。

#include<bits/stdc++.h> 
int read(){int x=0,w=1;char ch=0;while(ch<'0' || ch>'9'){ch=getchar();if(ch=='-') w=-1;}while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*w;}
const int KI=2e5+1;
bool vis1[KI],vis2[KI];
int cnt1[KI][2],cnt2[KI][2];

void solve()
{
	memset(vis1,0,sizeof vis1);memset(vis2,0,sizeof vis2);
	memset(cnt1,0,sizeof cnt1);memset(cnt2,0,sizeof cnt2);
	int n=read();
	std::string s1,s2,s3,s4;
	std::cin>>s1>>s2>>s3>>s4;
	if(s1==s2)
	{
		std::cout<<n<<'\n';
		return ;
	}
	for(int i=0;i<n;i++) if(s3[i]=='0') vis1[i]=1;
	for(int i=0;i<n;i++) if(s4[i]=='0') vis2[i]=1;
	std::vector<std::pair<int,int> >vec1;
	std::vector<std::pair<int,int> >vec2;
	vis1[n]=1;vis2[n]=1;
	int lst1=0,lst2=0;
	for(int i=0;i<=n;i++)
	{
		if(vis1[i])
		{
			vec1.push_back(std::make_pair(lst1+1,i+1));
			lst1=i+1;
		}
		if(vis2[i])
		{
			vec2.push_back(std::make_pair(lst2+1,i+1));
			lst2=i+1;
		}
	} 
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			if(s1[j-1]=='0') cnt1[i][0]++;
			if(s1[j-1]=='1') cnt1[i][1]++;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			if(s2[j-1]=='0') cnt2[i][0]++;
			if(s2[j-1]=='1') cnt2[i][1]++;
		}
	}
	if(s3==s4)
	{
		int anx=0;
		for(int i=0;i<vec2.size();i++) anx+=(std::min(cnt1[i][0],cnt2[i][0])+std::min(cnt1[i][1],cnt2[i][1]));
		for(int i=1;i<=n;i++) if(s3[i-1]=='0') if(s1[i-1]==s2[i-1]) anx++;
		std::cout<<anx<<'\n';
		return ;
	}
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			int x=s2[j-1]-'0';
			if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
			else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			int x=s1[j-1]-'0';
			if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
			else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
		}
	}
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			if(s1[j-1]=='0') cnt1[i][0]++;
			if(s1[j-1]=='1') cnt1[i][1]++;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			if(s2[j-1]=='0') cnt2[i][0]++;
			if(s2[j-1]=='1') cnt2[i][1]++;
		}
	}
//复制粘贴开始
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			int x=s2[j-1]-'0';
			if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
			else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			int x=s1[j-1]-'0';
			if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
			else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
		}
	}
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			if(s1[j-1]=='0') cnt1[i][0]++;
			if(s1[j-1]=='1') cnt1[i][1]++;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			if(s2[j-1]=='0') cnt2[i][0]++;
			if(s2[j-1]=='1') cnt2[i][1]++;
		}
	}
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			int x=s2[j-1]-'0';
			if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
			else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			int x=s1[j-1]-'0';
			if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
			else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
		}
	}
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			if(s1[j-1]=='0') cnt1[i][0]++;
			if(s1[j-1]=='1') cnt1[i][1]++;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			if(s2[j-1]=='0') cnt2[i][0]++;
			if(s2[j-1]=='1') cnt2[i][1]++;
		}
	}
	for(int i=0;i<vec1.size();i++)
	{
		for(int j=vec1[i].first;j<vec1[i].second;j++)
		{
			int x=s2[j-1]-'0';
			if(cnt1[i][x]>0) s1[j-1]=s2[j-1],cnt1[i][x]--;
			else s1[j-1]=((x^1)+'0'),cnt1[i][x^1]--;
		}
	}
	for(int i=0;i<vec2.size();i++)
	{
		for(int j=vec2[i].first;j<vec2[i].second;j++)
		{
			int x=s1[j-1]-'0';
			if(cnt2[i][x]>0) s2[j-1]=s1[j-1],cnt2[i][x]--;
			else s2[j-1]=((x^1)+'0'),cnt2[i][x^1]--;
		}
	}
//	std::cout<<s1<<' '<<s2<<'\n';
	int ans=0;
	for(int i=0;i<n;i++) if(s1[i]==s2[i]) ans++;
	std::cout<<ans<<'\n';
}
/*
1
6
110010
010101
000011
111001
*/
signed main()
{
	int T=read();
	while(T--) solve();
}
2025/6/12 21:58
加载中...