给定一个数,在正常的二进制中它的表示是唯一的。
而在这道题中,由许多种表示方法。比如1,可以是1,可以是2+(-1),可以是4+(-2)+(-1),但是有一点是确定的,如果要构造这个1,要么选1,要么选-1和后面的数组合,不可以不选。
所以由低到高枚举N的每个二进制位,如果这一位上是1,那么不管字符串中这一位是正的还是负的都必须选,如果是负的,那么后面就要多凑出1把这个-1对掉,所以N要+1
如果遍历了k个位N还没变成0,那么就是Impossible
POJ坑:long long可以过 unsigned long long不能过!
代码:
//
// main.cpp
// 1023 The Fun Number System
//
// Created by Baoli1100 on 15/4/1.
// Copyright (c) 2015年 Baoli1100. All rights reserved.
//
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
bool k[70];
LL N;
int res[70];
bool solve(int len){
while(N){
if(len<0) return 0;
if(N&1){
res[len]=1;
if(!k[len]){
N++;
}
}
len--;
N>>=1;
}
return 1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(res,0,sizeof(res));
memset(k,0,sizeof(k));
int l;
scanf("%d",&l);
char s[100];
scanf("%s",s);
for(int i=0;i<l;i++){
if(s[i]=='n') k[i]=0;
else k[i]=1;
}
scanf("%lld",&N);
if(solve(l-1)){
for(int i=0;i<l;i++){
printf("%d",res[i]);
}
printf("\n");
}
else printf("Impossible\n");
}
return 0;
}