Luogu P11361 NOIP2024 编辑字符串 题解 [ 黄 ] [ 贪心 ]

编辑字符串:这题能评蓝已经说明了洛谷的唐氏。

结论

找到两个字符串种连续的且可以移动的所有极大子区间,然后线性扫一遍,看这一位所处的子区间中有多少个 01,两个都有 0 就先消 0,否则如果两个都有 1 就把 1 消掉,就做完了。

时间 O(Tn)

证明

洛谷上有一种很妙的证明,借鉴一下。

这题的答案显然是:

ni=1n(aibi)2=n(i=1n(ai2+bi22aibi))

=n(i=1nai2+i=1nbi2i=1n2aibi)

=ni=1nai2i=1nbi2+i=1n2aibi

显然 ni=1nai2i=1nbi2 已经是定值,那么我们要最大化 i=1n2aibi,就要把 ai,bi 先全部放 1

由于这题 01 具有对称性,所以先全部放 0 也是对的。

代码

代码也不难写,考场上 10min 打完的,思路也就想了 10min,还包括手模样例的时间。

这题做出来不能说明强,但是真正强的绝对会这题,那些自称强的还做不出来的纯属基础不牢,菜就多练。天天升升升的升你妈呢。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,cnta,cntb,bla[100005],blb[100005],tota[100005][2],totb[100005][2],ans;
bitset<100005>a,b,ta,tb;
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char x;
        cin>>x;
        a[i]=(x-'0');
    }
    for(int i=1;i<=n;i++)
    {
        char x;
        cin>>x;
        b[i]=(x-'0');
    }
    cnta=0;
    for(int i=1;i<=n;i++)
    {
        char x;
        cin>>x;
        ta[i]=(x-'0');
        if(ta[i]!=ta[i-1]||ta[i]==0)cnta++;
        bla[i]=cnta;
    }
    cntb=0;
    for(int i=1;i<=n;i++)
    {
        char x;
        cin>>x;
        tb[i]=(x-'0');
        if(tb[i]!=tb[i-1]||tb[i]==0)cntb++;
        blb[i]=cntb;
    }
    memset(tota,0,sizeof(tota));
    memset(totb,0,sizeof(totb));
    for(int i=1;i<=n;i++)
    {
        tota[bla[i]][a[i]]++;
        totb[blb[i]][b[i]]++;
    }
    ans=0;
    for(int i=1;i<=n;i++)
    {
        if(tota[bla[i]][0]>0&&totb[blb[i]][0]>0)
        {
            ans++;
            tota[bla[i]][0]--;
            totb[blb[i]][0]--;
        }
        else if(tota[bla[i]][1]>0&&totb[blb[i]][1]>0)
        {
            ans++;
            tota[bla[i]][1]--;
            totb[blb[i]][1]--;
        }
    }
    cout<<ans<<'\n';
}
int main()
{
    freopen("edit.in","r",stdin);
    freopen("edit.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)solve();
    return 0;
}
posted @   KS_Fszha  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示