poj1023

//============================================================================
// Name        : 1023.cpp
// Author      : sww
// Version     : 1.0
// Time	       : 2013-11-13 12:54:25
//===========================================================================

#include <stdio.h>
#include <cstring>
using namespace std;

#define K 64
typedef long long Long;
typedef unsigned long long Ulong;

int k;
char data[K + 1];
Long temp;
Ulong value;
Ulong p[K];
int isPositive;
bool ok;
int out[K];

void cal(int n, Ulong value) {
	if (n < 0) {
		if (value == 0)
			ok = 1;
		else
			ok = 0;
		return;
	}
	if (value & 1) {
		out[n] = 1;
		if (data[n] == 'p' && isPositive || data[n] == 'n' && !isPositive) {
			value -= 1;
		} else {
			value += 1;
		}
	} else {
		out[n] = 0;
	}
	value = value >> 1;
	cal(n - 1, value);
}

int main() {
	p[0] = 1;
	for (int i = 1; i < K; i++) {
		p[i] = p[i - 1] << 1;
	}
	int t;
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &k);
		scanf("%s", data);
		scanf("%lld", &temp);
		if (temp < 0) {
			value = -temp;
			isPositive = 0;
		} else {
			value = temp;
			isPositive = 1;
		}
		cal(k - 1, value);
		if (ok) {
			Ulong sum = 0;
			for (int i = 0; i < k; i++) {
				if (out[i]) {
					if (data[i] == 'p' && isPositive
							|| data[i] == 'n' && !isPositive) {
						sum += p[k - i - 1];
					} else {
						sum -= p[k - i - 1];
					}
				}
			}
			if (sum == value) {
				for (int i = 0; i < k; i++) {
					printf("%d", out[i]);
				}
				puts("");
			} else {
				puts("Impossible");
			}
		} else {
			puts("Impossible");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/swwlqw/article/details/15813217
今日推荐