原题链接
思路:
对于串 s 的某个 0\(s_{i}\),
如果对应的 \(w_{i-x}\) 和 \(w_{i+x}\) 存在,那么这两个位置上一定是 0.
对于串 s 的某个 1\(s_{i}\),
则对应的 \(w_{i-x}\) 和 \(w_{i+x}\) 一定有一个存在且为 1.
根据上面两个定理,可以得到一个算法:
通过串 s 中的 0 确定 w 中 0 的位置,然后使用定理二判断是否合法,
若合法则剩余位置全部填 1.
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include <iostream> #include <string> using namespace std;
int main() { ios::sync_with_stdio(false); int T; cin >> T; while(T--) { string s; int x; cin >> s >> x; int n = s.size(); string a(n,'x'); bool isans(true); for(int i(0);i<n;++i) { if(s[i]=='0') { if(i>=x) { if(a[i-x]=='x') { a[i-x] = '0'; } } if(i<n-x) { if(a[i+x]=='x') { a[i+x] = '0'; } } } } for(int i(0);i<n;++i) { if(s[i]=='1') { int cnt(0); if(i>=x) { if(a[i-x]=='x') { a[i-x] = '1'; ++cnt; } else if(a[i-x]=='1') { ++cnt; } } if(i<n-x) { if(a[i+x]=='x') { a[i+x] = '1'; ++cnt; } else if(a[i+x]=='1') { ++cnt; } } if(cnt==0) { isans = false; break; } } } for(int i(0);i<n;++i) { if(a[i]=='x') { a[i] = '1'; } } if(!isans) { cout << -1 << endl; continue; } else { cout << a << endl; } } return 0; }
|