codeforces 1400 C

Problem - 1400C - Codeforces

题意:你有一个 长度为 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值