题意:考虑如下的过程。你有一个长度为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;
}