社区讨论

95求调,WA#2

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m4p4emvy
此快照首次捕获于
2024/12/15 12:43
去年
此快照最后确认于
2025/11/04 12:48
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
bool a[maxn],b[maxn];
char s1[maxn],s2[maxn];
struct str{
	int sum1,sum0;
	int last;
	int l,r;
}s[maxn],m[maxn];
int main(){
//	freopen("edit.in","r",stdin);
//	freopen("edit.out","w",stdout);
	short T;
	cin>>T;
	while(T--){
		int n,flag=2;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(s,0,sizeof(s));
		memset(m,0,sizeof(m));
		long long 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++){
			char x;
			cin>>x;
			if(x=='1')a[i]=1;
		}
		for(int i=1;i<=n;i++){
			char x;
			cin>>x;
			if(x=='1')b[i]=1;
		}
		int o=1;s[1].l=1;
		for(int i=1;i<=n;i++){
			if(s1[i]=='0')s[o].sum0++;
			else if(s1[i]=='1')s[o].sum1++;
			if(a[i]==0||i==n){
				s[o].r=i;
				s[o].last=s1[i]-48;
				o++;
				s[o].l=i+1;
			}
		}
		o--;
		int p=1;m[1].l=1;
		for(int i=1;i<=n;i++){
			if(s2[i]=='0')m[p].sum0++;
			else if(s2[i]=='1')m[p].sum1++;
			if(b[i]==0||i==n){
				m[p].r=i;
				m[p].last=s2[i]-48;
				p++;
				m[p].l=i+1;
			}
		}
		p--;
		int o1=1,p1=1;
		while(o1<=o&&p1<=p){
			if(s[o1].r==m[p1].r){
				if(s[o1].last==1&&m[p1].last==1)ans++,s[o1].sum1--,m[p1].sum1--;
				else if(s[o1].last==0&&m[p1].last==0)ans++,s[o1].sum0--,m[p1].sum0--;
				else if(s[o1].last==1&&m[p1].last==0){
					s[o1].sum1--,m[p1].sum0--;
					if(o1==o&&a[n]==1)s[o1].sum1++;
					if(p1==p&&b[n]==1)m[p1].sum0++;
				}
				else if(s[o1].last==0&&m[p1].last==1){
					s[o1].sum0--,m[p1].sum1--;
					if(o1==o&&a[n]==1)s[o1].sum0++;
					if(p1==p&&b[n]==1)m[p1].sum1++;
				}
				ans+=min(s[o1].sum0,m[p1].sum0);
				ans+=min(s[o1].sum1,m[p1].sum1);
				o1++,p1++;
			}
			else if(s[o1].r<m[p1].r){
				if(m[p1].last==1){
					m[p1].sum1--,flag=1;
					if(p1==p&&b[n]==1)m[p1].sum1++,flag=2;
				}
				else if(m[p1].last==0){
					m[p1].sum0--,flag=0;
					if(p1==p&&b[n]==1)m[p1].sum0++,flag=2;
				}
				if(m[p1].sum0<=s[o1].sum0)ans+=m[p1].sum0,m[p1].sum1-=(s[o1].sum0-m[p1].sum0),m[p1].sum0=0;
				else ans+=s[o1].sum0,m[p1].sum0-=s[o1].sum0;
				if(m[p1].sum1<=s[o1].sum1)ans+=m[p1].sum1,m[p1].sum0-=(s[o1].sum1-m[p1].sum1),m[p1].sum1=0;
				else ans+=s[o1].sum1,m[p1].sum1-=s[o1].sum1;
				o1++;
				if(flag==1)m[p1].sum1++;
				else if(flag==0)m[p1].sum0++;
				flag=2;
			}
			else if(s[o1].r>m[p1].r){
				if(s[o1].last==1){
					s[o1].sum1--,flag=1;
					if(o1==o&&a[n]==1)s[o1].sum1++,flag=2;
				}
				else if(s[o1].last==0){
					s[o1].sum0--,flag=0;
					if(o1==o&&a[n]==1)s[o1].sum0++,flag=2;
				}
				if(s[o1].sum0<=m[p1].sum0)ans+=s[o1].sum0,s[o1].sum1-=(m[p1].sum0-s[o1].sum0),s[o1].sum0=0;
				else ans+=m[p1].sum0,s[o1].sum0-=m[p1].sum0;
				if(s[o1].sum1<=m[p1].sum1)ans+=s[o1].sum1,s[o1].sum0-=(m[p1].sum1-s[o1].sum1),s[o1].sum1=0;
				else ans+=m[p1].sum1,s[o1].sum1-=m[p1].sum1;
				p1++;
				if(flag==1)s[o1].sum1++;
				else if(flag==0)s[o1].sum0++;
				flag=2;
			}
		}
		cout<<ans<<endl;
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

回复

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

正在加载回复...