社区讨论

乱搞贪心求正确性证明

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@midzmdnm
此快照首次捕获于
2025/11/25 10:59
3 个月前
此快照最后确认于
2025/11/25 13:07
3 个月前
查看原帖
思路是从左往右扫其中一个串,当前为第 ii 个位置字符,如果失配那么找到另一个串在 i\ge i 位置字符中第一个与当前字符相等的字符而且可以交换到那么就交换。
改了改顺序就过了。

为啥?

CPP

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int Size=(1<<20)+1;
char buf[Size],*p1=buf,*p2=buf;
char buffer[Size];
int op1=-1;
const int op2=Size-1;
#define getchar()                                                              \
(tt == ss && (tt=(ss=In)+fread(In, 1, 1 << 20, stdin), ss == tt)     \
	? EOF                                                                 \
	: *ss++)
char In[1<<20],*ss=In,*tt=In;
inline int read()
{
	int x=0,c=getchar(),f=0;
	for(;c>'9'||c<'0';f=c=='-',c=getchar());
	for(;c>='0'&&c<='9';c=getchar())
		x=(x<<1)+(x<<3)+(c^48);
	return f?-x:x;
}
inline void write(int x)
{
	if(x<0) x=-x,putchar('-');
	if(x>9)  write(x/10);
	putchar(x%10+'0');
}

// #ifndef ONLINE_JUDGE
// #define ONLINE_JUDGE
// #endif

string s1,s2,t1,t2;
int ans=0;
int n;

void count()
{
	int cnt=0;
	for(int i=0;i<n;i++) cnt+=s1[i]==s2[i];
	ans=max(ans,cnt);
}

void work()
{
	int nw=0;
	for(int i=0;i<n;i++)
	{
		if(s1[i]==s2[i]) continue;
		if(s2[i]=='0'||t1[i]=='0') continue;
		nw=max(nw,i); 
		while(nw<n&&s1[nw]=='0'&&t1[nw]=='1') nw++;
		if(nw>=n||t1[nw]=='0') continue;
		swap(s1[i],s1[nw]);
	}
	count();
	// cout<<s1<<"\n"<<s2<<"\n\n";

	nw=0;
	for(int i=0;i<n;i++)
	{
		if(s1[i]==s2[i]) continue;
		if(s2[i]=='1'||t1[i]=='0') continue;
		nw=max(nw,i); 
		while(nw<n&&s1[nw]=='1'&&t1[nw]=='1') nw++;
		if(nw>=n||t1[nw]=='0') continue;
		swap(s1[i],s1[nw]);
	}
	// cout<<s1<<"\n"<<s2<<"\n\n";
	
	count();
}

void solve()
{
	// ans=0;
	cin>>n>>s1>>s2>>t1>>t2;
	ans=0;
	for(int i=1;i<=5;i++)
	{
		work();
		swap(s1,s2);
		swap(t1,t2);

		reverse(s1.begin(),s1.end());
		reverse(s2.begin(),s2.end());
		reverse(t1.begin(),t1.end());
		reverse(t2.begin(),t2.end());
		work();
		swap(s1,s2);
		swap(t1,t2);
		work();
		swap(t1,t2);
		swap(s1,s2);
		work();
		swap(t1,t2);
		swap(s1,s2);

		reverse(s1.begin(),s1.end());
		reverse(s2.begin(),s2.end());
		reverse(t1.begin(),t1.end());
		reverse(t2.begin(),t2.end());
	}
	cout<<ans<<"\n";
}

signed main()
{
	#ifndef ONLINE_JUDGE
	freopen("edit.in","r",stdin);
	freopen("edit.out","w",stdout);
	#endif

	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin>>T;
	while(T--) solve();

	// #ifndef ONLINE_JUDGE
	// #endif
	//mt19937_64 myrand(time(0));
	return 0;
}

回复

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

正在加载回复...