求HACK
查看原帖
求HACK
562569
kingho11楼主2024/12/1 20:39

rt,按照思路写完只有40pts,过了大样例,洛谷只过了 #5~#12,求给各位大佬给个hack。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,tot,tot2;
bool s[N],s2[N],t[N],t2[N];
struct uuu{
	int l,r,cntw,cntb;
}a[N],b[N];
void readd()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		char ch;
		cin>>ch;
		s[i]=ch-'0'; 
	}
	for(int i=1;i<=n;i++)
	{
		char ch;
		cin>>ch;
		s2[i]=ch-'0'; 
	}
	for(int i=1;i<=n;i++)
	{
		char ch;
		cin>>ch;
		t[i]=ch-'0'; 
	}
	for(int i=1;i<=n;i++)
	{
		char ch;
		cin>>ch;
		t2[i]=ch-'0'; 
	}
}
bool b1=0;
void solvea()
{
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(s[i]==s2[i]) cnt++;
	}
	cout<<cnt<<"\n";
}
void solveb()
{
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(t[i]==1)
		{
			int cntw=0,cntb=0,cntw2=0,cntb2=0;
			while(i<=n && t[i]==1)
			{
				if(s[i]==1) cntb++;
				if(s[i]==0) cntw++;
				if(s2[i]==1) cntb2++;
				if(s2[i]==0) cntw2++;
				i++;
			}
			i--;
			ans+=min(cntb,cntb2)+min(cntw,cntw2);
		}else if(s[i]==s2[i]) ans++;
	}
	cout<<ans<<"\n";
}
void teshuxingzhi()
{
	bool fla=1;
	for(int i=1;i<=n-1;i++)
	{
		if(s[i]!=s[i+1])
		{
			fla=0;
			break;
		}
	}
	if(fla)
	{
		b1=1;
		solvea();
		return ;
	}
	bool flb=1;
	for(int i=1;i<=n;i++)
	{
		if(t[i]!=t2[i])
		{
			flb=0;
			break;
		}
	}
	if(flb)
	{
		b1=1;
		solveb();
		return ;
	}
}
void init()
{
	b1=0;
	tot=tot2=0;
}
int jiao(int l,int r,int ll,int rr)
{
	int L=max(l,ll),R=min(r,rr);
	return R-L+1;
}
void solve()
{
	readd();
	init();
	teshuxingzhi();
	if(b1) return ;
	for(int i=1;i<=n;i++)
	{
		if(t[i]==1)
		{
			a[++tot].l=i;
			a[tot].cntb=a[tot].cntw=0;
			while(i<=n && t[i]==1)
			{
				if(s[i]==1) a[tot].cntb++;
				if(s[i]==0) a[tot].cntw++;
				i++;
			}
			i--;
			a[tot].r=i;
		}else
		{
			a[++tot].l=a[tot].r=i;
			a[tot].cntb=a[tot].cntw=0;
			if(s[i]==1) a[tot].cntb=1;
			if(s[i]==0) a[tot].cntw=1;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(t2[i]==1)
		{
			b[++tot2].l=i;
			b[tot2].cntb=b[tot2].cntw=0;
			while(i<=n && t2[i]==1)
			{
				if(s2[i]==1) b[tot2].cntb++;
				if(s2[i]==0) b[tot2].cntw++;
				i++;
			}
			i--;
			b[tot2].r=i;
		}else
		{
			b[++tot2].l=b[tot2].r=i;
			b[tot2].cntb=b[tot2].cntw=0;
			if(s2[i]==1) b[tot2].cntb=1;
			if(s2[i]==0) b[tot2].cntw=1;
		}
	}
	int ans=0;
	for(int i=1,j=1;i<=tot,j<=tot2;)
	{
		int ra=a[i].r,rb=b[j].r;
		int mb=min(a[i].cntb,b[j].cntb),mw=min(a[i].cntw,b[j].cntw);
		int p=jiao(a[i].l,a[i].r,b[j].l,b[j].r);
		if(mw+mb<p)
		{
			ans+=mb+mw;
			a[i].cntb-=mb,a[i].cntw-=mw;
			b[j].cntb-=mb,b[j].cntw-=mw;
		}else
		{
			if(mb>p)
			{
				ans+=p;
				a[i].cntb-=p,b[j].cntb-=p;
			}else
			{
				ans+=mb;
				p-=mb;
				a[i].cntb-=mb,b[j].cntb-=mb;
				if(mw>p)
				{
					ans+=p;
					a[i].cntw-=p,b[j].cntw-=p;
				}else
				{
					ans+=mw;
					a[i].cntw-=mw,b[j].cntw-=mw;
				}
			}
		}
		if(ra>rb) j++;
		else if(ra<rb) i++;
		else i++,j++;
	}
	cout<<ans<<"\n";
}
signed main()
{
//	freopen("edit2.in","r",stdin);
//	freopen("edit.out","w",stdout);
	int _;
	cin>>_;
	while(_--)
	{
		solve();
	}
}
2024/12/1 20:39
加载中...