2025.12.18每日一题:01串题

Hanzhi_OvO的头像 发布于 2025-12-18 144 次阅读


题目来源:https://ac.nowcoder.com/acm/problem/237733

我们思考这个问题,要求删除到最后的串是一个01交替串。先思考为什么会有不能构造的情况。我们假设给定的字符‘0’的个数 a 和字符‘1’的个数 b 可以满足构造要求,那么最后剩余串长度为 x,也就是说需要‘0’和‘1’都提供 x/2 个字符。那么我们计算一下构造完最后剩余串后‘0’和‘1’还剩下几个,把它们分别记作 left_aleft_b。我们知道,如果需要前面的删除操作一直正常进行,让前面被删除串全部删光,那么‘0’和‘1’在前串的总个数必须为偶数,所以只需要判断 left_aleft_b 是否为偶数即可。

接下来考虑如果可以构造,我们的构造方法。由于上述分析中我们计算了用来构造被删除串(即前串)中‘0’和‘1’的个数,我们先分别让‘0’和‘1’输出。确保相同的字符连在一起并且个数为偶数,删除操作结束后不会有剩余。再构造剩余串,让‘0’和‘1’交替输出。这里注意一下和前串连接的字符不能一样。

如果觉得讲述有点晕乎乎,下面是 AC Code

// LANG:C++
// Auther:Hanzhi

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef __int128 lll;

typedef pair<ll,ll> P;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a,b,x;
    cin>>a>>b>>x;
    // x is left length
    int la=a-x/2,lb=b-x/2;
    if(la%2!=0||lb%2!=0||la<0||lb<0) cout<<-1;
    else 
    {
        for(int i=0;i<la;i++) cout<<0;
        for(int i=0;i<lb;i++) cout<<1;
        for(int i=1;i<=x;i++)
        {
            if(i%2==0) cout<<1;
            else cout<<0;
        }
    }
    return 0;
}