社区讨论

为什么我才60分玄关

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi0vi4w6
此快照首次捕获于
2025/11/16 06:43
4 个月前
此快照最后确认于
2025/11/16 13:40
4 个月前
查看原帖
C
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+3;
struct Node{
	int sum0,sum1;
}str[2*N];
int n,ans,x[N],y[N],a[N],b[N],cnt;
int main(){
	int T;cin >>T;
	while(T--){
		cnt=ans=0;
		string tstr;cin >>n;
		for(int i=0;i<n;i++)str[i].sum0=str[i].sum1=0;
		cin >>tstr;for(int i=0;i<n;i++)a[i]=tstr[i]-'0';
		cin >>tstr;for(int i=0;i<n;i++)b[i]=tstr[i]-'0';
		cin >>tstr;
		for(int i=0;i<n;i++){
			if(tstr[i]=='1'){
				x[i]=cnt;
				if(a[i]==0)str[cnt].sum0++;
				else str[cnt].sum1++;
			}
			else x[i]=-1,cnt++;
		}
		cnt++,cin >>tstr;
		for(int i=0;i<n;i++){
			if(tstr[i]=='1'){
				y[i]=cnt;
				if(b[i]==0)str[cnt].sum0++;
				else str[cnt].sum1++;
			}
			else y[i]=-1,cnt++;
		}
		x[n]=y[n]=-1;
		for(int i=0;i<n;i++){
			if(x[i]==-1||y[i]==-1){
				if(x[i]==-1&&y[i]!=-1){
					if(a[i]==0&&str[y[i]].sum0)str[y[i]].sum0--,ans++;
					else if(a[i]==1&&str[y[i]].sum1)str[y[i]].sum1--,ans++;
				}
				else if(x[i]!=-1&&y[i]==-1){
					if(b[i]==0&&str[x[i]].sum0)str[x[i]].sum0--,ans++;
					else if(b[i]==1&&str[x[i]].sum1)str[x[i]].sum1--,ans++;
				}
				else if(x[i]==-1&&y[i]==-1){
					if(a[i]==b[i])ans++;
				}
			}
			else if(x[i+1]==-1||y[i+1]==-1){
				if(str[x[i]].sum0>str[y[i]].sum0){
					ans+=str[y[i]].sum0;
					str[x[i]].sum0-=str[y[i]].sum0;
					str[y[i]].sum0=0;
				}
				else if(str[x[i]].sum0<=str[y[i]].sum0){
					ans+=str[x[i]].sum0;
					str[y[i]].sum0-=str[x[i]].sum0;
					str[x[i]].sum0=0;
				}
				//
				if(str[x[i]].sum1>str[y[i]].sum1){
					ans+=str[y[i]].sum1;
					str[x[i]].sum1-=str[y[i]].sum1;
					str[y[i]].sum1=0;
				}
				else if(str[x[i]].sum1<=str[y[i]].sum1){
					ans+=str[x[i]].sum1;
					str[y[i]].sum1-=str[x[i]].sum1;
					str[x[i]].sum1=0;
				}
			}
		}
		cout <<ans<<"\n";
	}
	return 0;
}
好像是细节出错了awa

回复

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

正在加载回复...