社区讨论
请求加强数据
P11361[NOIP2024] 编辑字符串参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m472q0ag
- 此快照首次捕获于
- 2024/12/02 21:36 去年
- 此快照最后确认于
- 2025/11/04 13:26 4 个月前
Code:
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+100;
const int INF = 0x3f3f3f3f;
char s1[maxn],s2[maxn],t1[maxn],t2[maxn];
int T,n;
ll ans=0;
int li1=0,li2=0;
int cnt1,cnt0;
ll read()
{
ll x=0;
int w=1;
char ch=0;
while(ch<'0' || ch>'9')
{
if(ch=='-') w=-1;
ch = getchar();
}
while(ch>='0' && ch<='9')
{
x=(x<<3) + (x<<1) + (ch-'0');
ch=getchar();
}
return x*w;
}
void solve1(int lx,int x)
{
cnt1=cnt0=0;
for(int i=lx;i<=x;i++)
{
if(s1[i]=='1') cnt1++;
else cnt0++;
}
for(int i=lx;i<=x;i++)
{
if(s2[i]=='1')
{
if(cnt1>0) cnt1--,s1[i]='1';
else s1[i]='0';
}
else
{
if(cnt0>0)
cnt0--,s1[i]='0';
else s1[i]='1';
}
}
return;
}
void solve2(int lx,int x)
{
cnt1=cnt0=0;
for(int i=lx;i<=x;i++)
{
if(s2[i]=='1') cnt1++;
else cnt0++;
}
for(int i=lx;i<=x;i++)
{
if(s1[i]=='1')
{
if(cnt1>0) cnt1--,s2[i]='1';
else s2[i]='0';
}
else
{
if(cnt0>0) cnt0--,s2[i]='0';
else s2[i]='1';
}
}
return;
}
void solve3(int lx1,int lx2)
{
cnt1=cnt0=0;
for(int i=lx1;i<n;i++)
{
if(s1[i]=='1') cnt1++;
else cnt0++;
}
for(int i=lx1;i<lx2;i++)
{
if(s1[i]=='1')
{
if(cnt1>0) cnt1--,s1[i]='1';
else s1[i]='0';
}
else
{
if(cnt0>0) cnt0--,s1[i]='0';
else s1[i]='1';
}
}
int c11=0,c10=0,c21=0,c20=0;
for(int i=lx2;i<n;i++)
{
if(s1[i]=='1') c11++;
if(s1[i]=='0') c10++;
if(s2[i]=='1') c21++;
if(s2[i]=='0') c20++;
}
ans+=min(c11,c21)+min(c10,c20);
return;
}
void solve4(int lx1,int lx2)
{
cnt1=cnt0=0;
for(int i=lx2;i<n;i++)
{
if(s2[i]=='1') cnt1++;
else cnt0++;
}
for(int i=lx2;i<lx1;i++)
{
if(s2[i]=='1')
{
if(cnt1>0) cnt1--,s2[i]='1';
else s2[i]='0';
}
else
{
if(cnt0>0) cnt0--,s2[i]='0';
else s2[i]='1';
}
}
int c11=0,c10=0,c21=0,c20=0;
for(int i=lx1;i<n;i++)
{
if(s1[i]=='1') c11++;
if(s1[i]=='0') c10++;
if(s2[i]=='1') c21++;
if(s2[i]=='0') c20++;
}
ans=ans+min(c11,c21)+min(c10,c20);
return;
}
int main()
{
//freopen("edit.in","r",stdin);
//freopen("edit.out","w",stdout);
T=read();
while(T--)
{
cnt1=cnt0=ans=0;
li1=li2=0;
n=read();
cin>>s1>>s2>>t1>>t2;
for(int i=0;i<n;i++)
{
if(t1[i]=='0' || i==n-1)
{
solve1(li1,(i==n-1 && t1[i]=='1')?i:i-1);
li1=i+1;
}
if(t2[i]=='0' || i==n-1)
{
solve2(li2,(i==n-1 && t2[i]=='1')?i:i-1);
li2=i+1;
}
/*if(i==n-1)
{
if(li1<li2) solve3(li1,li2);
else solve4(li1,li2);
}*/
}
for(int i=0;i<n;i++)
if(s1[i]==s2[i])
ans++;
printf("%lld\n",ans);
}
return 0;
}
以上代码洛谷评测100分
错误样例:
CPPstd(题解代码)输出:7175
上述代码输出:7173
回复
共 1 条回复,欢迎继续交流。
正在加载回复...