社区讨论

求调

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhj97piv
此快照首次捕获于
2025/11/03 22:47
4 个月前
此快照最后确认于
2025/11/03 22:47
4 个月前
查看原帖
我的思路是先把s1,s2按照不能交换的字符划分区间,不能交换的字符自己占一个区间,然后统计答案。
问题是代码在本地编辑器中可以输出正确答案,在洛谷线上IDE上无法输出正确答案
answer of luoguIDE
answer of Dev-C++
代码如下
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int T;
struct segment
{
    int id;
    int l,r;
    int num0,num1;
}a1[maxn],a2[maxn];
int n,cnt1,cnt2,ans;
int hash1[maxn],hash2[maxn];
char s1[maxn],s2[maxn],c1[maxn],c2[maxn];
int main()
{
    ios::sync_with_stdio(0);
    cin>>T;
    while(T--)
    {
        memset(a1,0,sizeof(a1));
        memset(a2,0,sizeof(a2));
        memset(hash1,0,sizeof(hash1));
        memset(hash2,0,sizeof(hash2));
        cnt1=cnt2=ans=0;
        cin>>n;
        for (int i=1;i<=n;++i) cin>>s1[i];
        for (int i=1;i<=n;++i) cin>>s2[i];
        for (int i=1;i<=n;++i) cin>>c1[i];
        for (int i=1;i<=n;++i) cin>>c2[i];
		int lst=0,cur0=0,cur1=0;
		for (int i=1;i<=n;++i)
		{
		    if (s1[i]=='0') cur0++;
		    if (s1[i]=='1') cur1++;
		    if (i==1&&c1[i]=='0')
		    {
		        a1[++cnt1].l=a1[cnt1].r=1;
		        a1[cnt1].id=cnt1;
		        a1[cnt1].num0=cur0;
		        a1[cnt1].num1=cur1;
		        cur0=0,cur1=0;
		        lst++;
		        continue;
		    }
		    if (c1[i]=='0') 
		    {
		        a1[++cnt1].l=lst+1,a1[cnt1].r=i-1;
		        a1[cnt1].id=cnt1;
		        a1[cnt1].num0=cur0;
		        a1[cnt1].num1=cur1;
		        a1[++cnt1].l=a1[cnt1].r=i;
		        a1[cnt1].id=cnt1;
		        if (s1[i]=='0')
		        {
		            a1[cnt1-1].num0=a1[cnt1-1].num0-1;
		            a1[cnt1].num0=1;
		            a1[cnt1].num1=0;
		        }
		        else 
		        {
		            a1[cnt1-1].num1=a1[cnt1-1].num1-1;
		            a1[cnt1].num0=0;
		            a1[cnt1].num1=1;
		        }
		        lst=i,cur0=0,cur1=0;
		    }
		}  
		if (lst<n)
	    {
	    	a1[++cnt1].l=lst+1,a1[cnt1].r=n;
	    	a1[cnt1].id=cnt1;
	    	a1[cnt1].num0=cur0;
	    	a1[cnt1].num1=cur1;
	    }
	    lst=0,cur0=0,cur1=0;
	    for (int i=1;i<=n;++i)
	    {
	        if (s2[i]=='0') cur0++;
	        if (s2[i]=='1') cur1++;
	        if (i==1&&c2[i]=='0')
	        {
	            a2[++cnt2].l=a2[cnt2].r=1;
	            a2[cnt2].id=cnt2;
	            a2[cnt2].num0=cur0;
	            a2[cnt2].num1=cur1;
	            cur0=0,cur1=0;
	            lst++;
	            continue;
	        }
	        if (c2[i]=='0') 
	        {
	            a2[++cnt2].l=lst+1,a2[cnt2].r=i-1;
	            a2[cnt2].id=cnt2;
	            a2[cnt2].num0=cur0;
	            a2[cnt2].num1=cur1;
	            a2[++cnt2].l=a2[cnt2].r=i;
	            a2[cnt2].id=cnt2;
	            if (s2[i]=='0')
	            {
	                a2[cnt2-1].num0=a2[cnt2-1].num0-1;
	                a2[cnt2].num0=1;
	                a2[cnt2].num1=0;
	            }
	            else 
	            {
	                a2[cnt2-1].num1=a2[cnt2-1].num1-1;
	                a2[cnt2].num0=0;
	                a2[cnt2].num1=1;
	            }
	            lst=i,cur0=0,cur1=0;
	        }
	    }
		if (lst<n)
	    {
	    	a2[++cnt2].l=lst+1,a2[cnt2].r=n;
	    	a2[cnt2].id=cnt2;
	    	a2[cnt2].num0=cur0;
	    	a2[cnt2].num1=cur1;
	    }
	    /*
        for (int i=1;i<=cnt1;++i)
        {
        	cout<<a1[i].id<<"\n";
        	cout<<a1[i].l<<' '<<a1[i].r<<"\n";
        	cout<<a1[i].num0<<' '<<a1[i].num1<<"\n";
        	cout<<"\n";
        }
        cout<<"\n";
        for (int i=1;i<=cnt2;++i)
        {
        	cout<<a2[i].id<<"\n";
        	cout<<a2[i].l<<' '<<a2[i].r<<"\n";
        	cout<<a2[i].num0<<' '<<a2[i].num1<<"\n";
        	cout<<"\n";
        }
        */
        for (int i=1;i<=cnt1;++i)
        {
        	for (int j=a1[i].l;j<=a1[i].r;++j)
        	{
        		hash1[i]=a1[i].id;
        	}
        }
        for (int i=1;i<=cnt2;++i)
        {
        	for (int j=a2[i].l;j<=a2[i].r;++j)
        	{
        		hash2[i]=a2[i].id;
        	}
        }        
		for (int i=1;i<=n;++i)
		{
			int id1=hash1[i];
			int id2=hash2[i];
			if (a1[id1].num0>0&&a2[id2].num0>0) 
			{
				a1[id1].num0--;
				a2[id2].num0--;
				ans++;
				//cout<<ans<<' ';
			}
			else if (a1[id1].num1>0&&a2[id2].num1>0)
			{
				a1[id1].num1--;
				a2[id2].num1--;
				ans++;
				//cout<<ans<<' ';
			}
		}
		cout<<ans<<"\n";
    }
}
/*
1
6
011101
111010
111010
101101
*/

回复

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

正在加载回复...