社区讨论

请求加强数据

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分
错误样例:
input:
样例输入
output:
CPP
std(题解代码)输出:7175
上述代码输出:7173

回复

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

正在加载回复...