社区讨论

大样例能过但不确定,有DALAO帮忙看看吗

P11361[NOIP2024] 编辑字符串参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m44tvz10
此快照首次捕获于
2024/12/01 07:53
去年
此快照最后确认于
2025/11/04 13:32
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll signed long long
#define int signed long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int maxn=1e6,inf=1e18;
inline int read() {
	int f = 1, x = 0;char ch = getchar();
	while (ch < '0' || ch > '9'){if (ch == '-')f *= -1;ch = getchar();}
	while (ch >= '0' && ch <= '9')x = (x << 1) + (x << 3) + ch - 48, ch = getchar();
	return x * f;
}
signed main()
{
	int t=read();
	while(t--)
	{
		int n,s11=0,s10=0,s21=0,s20=0,r1=0,r2=0,ans=0;cin>>n;
		string s1,s2;cin>>s1>>s2;
		string t1,t2;cin>>t1>>t2;
		s1="%"+s1,s2="%"+s2,t1="0"+t1+"0",t2="0"+t2+"0";
		for(int i=1;i<=n;)
		{
			if(t1[i-1]=='0') 
			{
				int j=i;
				s11=s10=0;
				while(t1[j]!='0') s11+=(s1[j]=='1'),s10+=(s1[j]=='0'),j++;
				r1=j;
			}
			if(t2[i-1]=='0') 
			{
				int j=i;
				s21=s20=0;
				while(t2[j]!='0') s21+=(s2[j]=='1'),s20+=(s2[j]=='0'),j++;
				r2=j;
			}
			if(t1[i]==t2[i]&&t1[i]=='0') ans+=(s1[i]==s2[i]),i++;
			else if(t1[i]=='0')
			{
				if(s1[i]=='1'&&s21>0) s21--,ans++;
				else if(s1[i]=='1') s20--;
				else if(s1[i]=='0'&&s20>0) s20--,ans++;
				else s21--;
				i++;
			}
			else if(t2[i]=='0')
			{
				if(s2[i]=='1'&&s11>0) s11--,ans++;
				else if(s2[i]=='1') s10--;
				else if(s2[i]=='0'&&s10>0) s10--,ans++;
				else s11--;
				i++;
			}
			else
			{
				int r=min(r1,r2);
				ans+=min(s11,s21)+min(s10,s20);
				int k1=s11,k2=s10,k3=s21,k4=s20;
				s11=max(k1-k3,0),s10=max(k2-k4,0),s21=max(k3-k1,0),s20=max(k4-k2,0);
				if(r1>=r2) s11-=s20,s10-=s21;
				else s21-=s10,s20-=s11;
				i=r;
			}
		}
		cout<<ans<<"\n";
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...