社区讨论
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 条回复,欢迎继续交流。
正在加载回复...