80分求调 玄关
查看原帖
80分求调 玄关
748058
zzl090316楼主2024/12/2 19:21
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int T;
string s1,s2;
int n;
bool f1[maxn],f2[maxn];
int bl1[maxn],bl2[maxn];
int num1,num2;
void solveA()
{
	int ans=0;
	for(int i=0;i<n;i++)
	{
		if(s2[i]==s1[i])
		{
			ans++;
		}
	}
	cout<<ans<<endl;
	return ;
}
void solveB()
{
	int ans=0;
	int cnt[5][5]={0};
	for(int i=0;i<n;i++)
	{
		if(f1[i]==0)
		{
			ans+=(s1[i]==s2[i]? 1:0);
			cnt[1][0]=0;
			cnt[1][1]=0;
			cnt[2][0]=0;
			cnt[2][1]=0;
			continue;
		}
		if(i==0||f1[i-1]==0)
		{
			cnt[1][0]=0;
			cnt[1][1]=0;
			cnt[2][0]=0;
			cnt[2][1]=0;
			cnt[1][s1[i]-'0']++;
			cnt[2][s2[i]-'0']++;
		}
		if(f1[i+1]==0)
		{
			if(i!=0&&f1[i-1]!=0)
			{
				cnt[1][s1[i]-'0']++;
				cnt[2][s2[i]-'0']++;
			}
			ans+=min(cnt[1][0],cnt[2][0])+min(cnt[1][1],cnt[2][1]);
			cnt[1][0]=0;
			cnt[1][1]=0;
			cnt[2][0]=0;
			cnt[2][1]=0;
		}
		if(i!=0&&f1[i-1]!=0&&f1[i+1]!=0&&f1[i]!=0)
		{
			cnt[1][s1[i]-'0']++;
			cnt[2][s2[i]-'0']++;
		}
	}
	cout<<ans<<endl;
	return ;
}
int cnt[3][3][maxn];
int main()
{
// 	freopen("edit.in","r",stdin);
// 	freopen("edit.out","w",stdout);
	cin>>T;
	while(T--)
	{
		cin>>n;
		cin>>s1>>s2;
		char t;
		bool fB=1;
		for(int i=0;i<n;i++)
		{
			cin>>t;
			f1[i]=t-'0';
		}
		for(int i=0;i<n;i++)
		{
			cin>>t;
			f2[i]=t-'0';
			if(f2[i]!=f1[i])
			{
				fB=0;
			}
		}
		int fA=1;
		for(int i=1;i<n;i++)
		{
			if(s1[i]!=s1[i-1])
			{
				fA=0;
			}
		}
		f1[n]=0;
		f2[n]=0;
		if(fA)
		{
			solveA();
			continue;
		}
		if(fB)
		{
			solveB();
			continue;
		}
		memset(cnt,0,sizeof(cnt));
		num1=0,num2=0;
		cnt[1][s1[0]-'0'][++num1]++;
		bl1[0]=num1;
		if(f1[0]==0)
		{
			num1++;
		}
		cnt[2][s2[0]-'0'][++num2]++;
		bl2[0]=num2;
		if(f2[0]==0)
		{
			num2++;
		}
		for(int i=1;i<n;i++)
		{
			if(f1[i]==0)
			{
				cnt[1][s1[i]-'0'][++num1]++;
				bl1[i]=num1;
				num1++;
			}
			else
			{
				cnt[1][s1[i]-'0'][num1]++;
				bl1[i]=num1;
			}
			if(f2[i]==0)
			{
				cnt[2][s2[i]-'0'][++num2]++;
				bl2[i]=num2;
				num2++;
			}
			else
			{
				cnt[2][s2[i]-'0'][num2]++;
				bl2[i]=num2;
			}
		}
		int ans=0;
		for(int i=0;i<n;i++)
		{
			while(f1[i]!=0&&f2[i]!=0){
				i++;
			}
			if(f1[i]==0)
			{
				int t0,t1;
				t0=min(cnt[1][0][bl1[i-1]],cnt[2][0][bl2[i-1]]);
				t1=min(cnt[1][1][bl1[i-1]],cnt[2][1][bl2[i-1]]);
				ans+=t1+t0;
				cnt[1][0][bl1[i-1]]-=t0;
				cnt[2][0][bl2[i-1]]-=t0;
				cnt[1][1][bl1[i-1]]-=t1;
				cnt[2][1][bl2[i-1]]-=t1;
				if(i!=n)
				{
					int t=min(cnt[1][s1[i]-'0'][bl1[i]],cnt[2][s1[i]-'0'][bl2[i]]);
					ans+=t;
					cnt[1][s1[i]-'0'][bl1[i]]-=t;
					cnt[2][s1[i]-'0'][bl2[i]]-=t;
				}
			}
			else
			{
				int t0,t1;
				t0=min(cnt[1][0][bl1[i-1]],cnt[2][0][bl2[i-1]]);
				t1=min(cnt[1][1][bl1[i-1]],cnt[2][1][bl2[i-1]]);
				ans+=t1+t0;
				cnt[1][0][bl1[i-1]]-=t0;
				cnt[2][0][bl2[i-1]]-=t0;
				cnt[1][1][bl1[i-1]]-=t1;
				cnt[2][1][bl2[i-1]]-=t1;
				if(i!=n)
				{
					int t=min(cnt[1][s2[i]-'0'][bl1[i]],cnt[2][s2[i]-'0'][bl2[i]]);
					ans+=t;
					cnt[1][s2[i]-'0'][bl1[i]]-=t;
					cnt[2][s2[i]-'0'][bl2[i]]-=t;
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
2024/12/2 19:21
加载中...