Educational Codeforces Round 94 (Rated for Div. 2) C. Binary String Reconstruction (构造)
阅读原文时间:2023年07月08日阅读:2

  • 题意:给你一个字符串\(s\),原字符串为\(w\),如果\(i>x\)且\(w_{i-x}=1\),那么\(s_{i}=1\),如果\(i+x\le n\)且\(w_{i+x}=1\),那么\(s_{i}=1\),否则\(s_{i}=0\).求\(w\)的一种可能的情况.

  • 题解:对于\(s\)中的\(0\),我们知道,它左右两边距离\(x\)的地方一定都是\(0\),所以我们先假设\(w\)全为\(1\),然后再更新\(s_{i}\)为\(0\)的情况,最后判断一下\(1\)的情况在\(w\)合不合法即可.

  • 代码:

    int t;
    char s[N],w[N];
    int x;
    
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        t=read();
        while(t--){
            scanf("%s",s+1);
            x=read();
            int len=strlen(s+1);
            for(int i=1;i<=len;++i){
                w[i]='1';
            }
            for(int i=1;i<=len;++i){
                if(s[i]=='0'){
                    if(i>x) w[i-x]='0';
                    if(i+x<=len) w[i+x]='0';
                }
            }
            bool flag=1;
            for(int i=1;i<=len;++i){
                if(s[i]=='1'){
                   if(((i>x && w[i-x]!='1')||(i<=x)) && ((i+x<=len && w[i+x]!='1')||(i+x>len))){
                       flag=0;
                       break;
                   }
                }
            }
        if(!flag) puts("-1");
        else{
            for(int i=1;i&lt;=len;++i) printf("%c",w[i]);
        }
        puts("");
    }
    
    return 0;
    }