题意:你有一个 长度为 n的01字符串 w 以及一个整数 x. 你构造了一个新的字符串 s 包含 n 个字符. 第 i 个 字符 si 由以下操作决定
- 如果wi−x 存在且等于 1, 那么 si 为 1 (换句话说, 如果i > x 并且wi−x= 1, 那么 si= 1);
- 如果wi+x 存在且等于 1, 那么si 为 1 (换句话说, 如果 i + x ≤n 并且wi+x= 1,那么si= 1);
- 如果都不满足以上两个条件,那么 si 为 0.
你将得到一个整数x 和一个字符串 s. 找到原来的字符串w.
思路:考虑逆否命题,如果si为0是不是就说明wi+x必定=0且wi−x= 0(如果wi+x和wi-x存在),因此我们可以以0为断点去固定某些为0的wi,剩下的1再判断能不能满足就好了。
AC代码
#include<bits/stdc++.h>
#define js ios::sync_with_stdio(false)
#define ll long long
using namespace std;
const ll N=2e6+5;
const ll INF=0x3f3f3f;
long long a[N];
void solve(){
int lt;
string s,s1;
s+='0';//习惯问题,无伤大雅
cin>>s1;
lt=s1.size();
for(int i=1;i<=lt;i++)a[i]=0;
s+=s1;
int x;
cin>>x;
for(int i=1;i<=lt;i++){
if(s[i]=='0'){
if(i>x){
a[i-x]=1;
}
if(i+x<=lt){
a[i+x]=1;
}
}
}//先固定哪些位置一定是0
for(int i=1;i<=lt;i++){//判断能不能满足其他的1
if(s[i]=='1'){
if(i>x){
if(a[i-x]){
if(i+x>lt){
cout<<"-1\n";return ;
}
else{
if(a[i+x]){
cout<<"-1\n";return ;
}
}
}
}
else if(i<=x){
if(i+x>lt){
cout<<"-1\n";return ;
}
else{
if(a[i+x]){
cout<<"-1\n";return ;
}
}
}
}
}
for(int i=1;i<=lt;i++){
if(a[i])cout<<"0";
else cout<<"1";
}
cout<<endl;
}
int main(){
js;
int t;
cin>>t;
while(t--)
solve();
return 0;
}