Educational Codeforces Round 94 (Rated for Div. 2) 参与排名人数15221
[codeforces 1400C] Binary String Reconstruction 该题最大的难点是存在,i-x,i+x均不在字串的数据范围内的情况
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1400/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Binary String Reconstruction | GNU C++17 | Accepted | 31 ms | 600 KB |
题目大意:给出初始字符串w,可以通过如下关系,
获得字符串s.该题要求,通过字符串s,反推w,若存在,输出w,若不存在,输出-1.
基本思路:样例模拟如下:
101110
2
111011
位置123456
数值101110
根据位置进行设置
位置1
位置123456
数值101110
设置 1
位置2
位置123456
数值101110
设置 10
位置3
位置123456
数值101110
设置1 10
位置4
位置123456
数值101110
设置1110
位置5
位置123456
数值101110
设置1110
位置6
位置123456
数值101110
设置1110
空余部分,补0,或者补1,均可
故
111000
111011
均是答案。
AC代码如下:
#include <stdio.h>
#include <string.h>
#define maxn 100010
using namespace std;
char s[maxn],w[maxn];
int vis[maxn];
int main(){
int t,x,n,flag,i;
scanf("%d",&t);
while(t--){
scanf("%s%d",s+1,&x);
n=strlen(s+1);
for(i=1;i<=n;i++)vis[i]=0,w[i]='1';
w[n+1]='\0';
for(i=1;i<=n;i++){
flag=0;
if(s[i]=='1'){
if(i-x>0){
if(!vis[i-x])vis[i-x]=1,w[i-x]='1',flag=1;//i-x位置没被访问过
else if(w[i-x]=='1')flag=1;//vis[i-x]=1;//i-x位置已经被访问过
}if(!flag&&i+x<=n){//flag==0表示i-x位置没有找到满意结果,需要继续找
if(!vis[i+x])vis[i+x]=1,w[i+x]='1',flag=1;
else if(w[i+x]=='1')flag=1;//vis[i+x]=1;
}
}else{//s[i]=='0'
if(i-x>0){
if(!vis[i-x])vis[i-x]=1,w[i-x]='0',flag=1;
else if(w[i-x]=='0')flag=1;//vis[i-x]=1;
else flag=0;
if(!flag)break;
}
if(i+x<=n){//此处也要排查
if(!vis[i+x])vis[i+x]=1,w[i+x]='0',flag=1;
else if(w[i+x]=='0')flag=1;//vis[i+x]=1;
else flag=0;
}
if(i-x<=0&&i+x>n)flag=1;//存在,i-x,i+x均不在字串的数据范围内的情况。该题最大的难点
}
if(!flag)break;
}
if(!flag)printf("-1\n");
else printf("%s\n",w+1);
}
return 0;
}