C. Binary String Reconstruction

时间:2020-09-07 18:58:25   收藏:0   阅读:45

题意:考虑如下的过程。你有一个长度为n的二进制串w还有一个整数x。你构建了一个长度为n的二进制串s。二进制串s的第i个字符串的选择如下:
1.如果\(w_{i-x}\)存在并且等于1,那么\(s_{i}\)则等于1。
2.如果\(w_{i+x}\)存在并且等于1,那么\(s_{i}\)则等于1。
3.如果前两种情况都不存在,那么\(s_{i}\)则等于0。

给出字符串s和整数x,构造字符串w。

分析:规则告诉我们如果\(s_{i}\)为1,那么\(w_{i-x}\)\(w_{i+x}\)\(至少\)一个为1。如果\(s_{i}\)为0,那么\(w_{i-x}\)\(w_{i+x}\)都为0。那么我们先把w全都置为1,把要求是0的地方全都变成0。然后检测构造后的这个字符串是否满足要求。可以见代码。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
   
    int t;
    cin >> t;

    while (t--)
    {
        string s;
        cin >> s;
        int x;
        cin >> x;
        int len = s.size();
        string res(len, ‘1‘);

        for (int i = 0; i < s.size(); ++i)
        {
            if (s[i] == ‘0‘ && i - x >= 0) res[i - x] = ‘0‘;
            if (s[i] == ‘0‘ && i + x < len) res[i + x] = ‘0‘;
        }

        bool f = true;
        for (int i = 0; i < len; ++i)
        {
            bool flag = false;
            //两个中至少一个为1
            if ((i - x) >= 0 && res[i - x] == ‘1‘) flag = true;
            if ((i + x) < len && res[i + x] == ‘1‘) flag = true;

            if (s[i] == ‘1‘)
            {
                if (!flag)
                {
                    f = false;
                    cout << -1 << endl;
                    break;
                }
            }
        }
        if (f)
        {
            cout << res << endl;
        }
    }

    
    return 0;
}
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!