#include <iostream>
#include <vector>
using namespace std;
int range_1s = 0;
vector<int> ranges;
int possible_count = 0;
int toInt(string s);
void makeRanges(int size, int range);
bool checkHappy(int number, int size, int range);
int main() {
// your code goes here
string problem = "---+-++-";
int range = 3;
int size = problem.size();
int number = toInt(problem);
makeRanges(size, range);
if (number == 1) {
cout << "1";
} else if (checkHappy(number, size, range)) {
cout << possible_count;
} else {
cout << "Impossible";
}
cout << endl << number;
return 0;
}
int toInt(string s) {
int result = 0;
for (int i = s.size() - 1; i >= 0; --i) {
//cout << s[i];
if (s[i] == '+')
result += 1 << (s.size() - i - 1);
//cout << ": " << result << endl;
}
return result;
}
void makeRanges(int size, int range) {
if (size <= 0)
return;
ranges.clear();
int original = 1;
for (int i = 1; i < size; ++i)
range_1s = original = (original << 1) + 1;
cout << "original: " << original << endl;
for (int i = 0; i <= (range - size); ++i)
ranges.push_back(original << i);
// // to check ranges
// for (int n : ranges)
// cout << n << endl;
}
bool isPossibleHappy(int part_num, int part_count, int range, int flipper) {
if (part_count < range)
return false;
if (part_num < 0 || part_count <= 0)
return false;
if (part_num == 0 || part_num == 1)
return true;
int flipped = part_num ^ flipper;
if (flipped)
return true;
for (int i = range; i < part_count; ++i) {
flipper = flipper << 1;
if (isPossibleHappy(part_num, part_count, range + 1, flipper))
return true;
}
return false;
}
bool checkHappy(int target, int size, int range) {
int part_num = 0;
int part_count = 0;
for (int i = 0; i < size; ++i) {
++part_count;
part_num = part_num << 1;
// if bit is exist
if (target & (1 << (size - i - 1)))
part_num += 1;
cout << "part_count: " << part_count << ", ";
cout << "part_num: " << part_num << endl;
if (isPossibleHappy(part_num, part_count, range, range_1s)) {
if (i == (size - 1))
return true;
// initialzation
if (part_num > 1) {
part_num = 0;
part_count = 0;
}
}
}
return false;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmludCByYW5nZV8xcyA9IDA7CnZlY3RvcjxpbnQ+IHJhbmdlczsKaW50IHBvc3NpYmxlX2NvdW50ID0gMDsKaW50IHRvSW50KHN0cmluZyBzKTsKdm9pZCBtYWtlUmFuZ2VzKGludCBzaXplLCBpbnQgcmFuZ2UpOwpib29sIGNoZWNrSGFwcHkoaW50IG51bWJlciwgaW50IHNpemUsIGludCByYW5nZSk7CiAKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCiAKCXN0cmluZyBwcm9ibGVtID0gIi0tLSstKystIjsKCWludCByYW5nZSA9IDM7CiAKCWludCBzaXplID0gcHJvYmxlbS5zaXplKCk7CglpbnQgbnVtYmVyID0gdG9JbnQocHJvYmxlbSk7CgltYWtlUmFuZ2VzKHNpemUsIHJhbmdlKTsKIAogCWlmIChudW1iZXIgPT0gMSkgewogCQljb3V0IDw8ICIxIjsKIAl9IGVsc2UgaWYgKGNoZWNrSGFwcHkobnVtYmVyLCBzaXplLCByYW5nZSkpIHsKCQljb3V0IDw8IHBvc3NpYmxlX2NvdW50OwoJfSBlbHNlIHsKCQljb3V0IDw8ICJJbXBvc3NpYmxlIjsKCX0KIAoJY291dCA8PCBlbmRsIDw8IG51bWJlcjsKIAoJcmV0dXJuIDA7Cn0KIAppbnQgdG9JbnQoc3RyaW5nIHMpIHsKCWludCByZXN1bHQgPSAwOwogCglmb3IgKGludCBpID0gcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewoJCS8vY291dCA8PCBzW2ldOwogCgkJaWYgKHNbaV0gPT0gJysnKQoJCQlyZXN1bHQgKz0gMSA8PCAocy5zaXplKCkgLSBpIC0gMSk7CiAKCQkvL2NvdXQgPDwgIjogIiA8PCByZXN1bHQgPDwgZW5kbDsKCX0KIAoJcmV0dXJuIHJlc3VsdDsKfQogCnZvaWQgbWFrZVJhbmdlcyhpbnQgc2l6ZSwgaW50IHJhbmdlKSB7CglpZiAoc2l6ZSA8PSAwKQoJCXJldHVybjsKIAoJcmFuZ2VzLmNsZWFyKCk7CiAKCWludCBvcmlnaW5hbCA9IDE7Cglmb3IgKGludCBpID0gMTsgaSA8IHNpemU7ICsraSkKCQlyYW5nZV8xcyA9IG9yaWdpbmFsID0gKG9yaWdpbmFsIDw8IDEpICsgMTsKIAoJY291dCA8PCAib3JpZ2luYWw6ICIgPDwgb3JpZ2luYWwgPDwgZW5kbDsKIAoJZm9yIChpbnQgaSA9IDA7IGkgPD0gKHJhbmdlIC0gc2l6ZSk7ICsraSkKCQlyYW5nZXMucHVzaF9iYWNrKG9yaWdpbmFsIDw8IGkpOwogCgkvLyAvLyB0byBjaGVjayByYW5nZXMKCS8vIGZvciAoaW50IG4gOiByYW5nZXMpCgkvLyAJY291dCA8PCBuIDw8IGVuZGw7CiAKfQogCmJvb2wgaXNQb3NzaWJsZUhhcHB5KGludCBwYXJ0X251bSwgaW50IHBhcnRfY291bnQsIGludCByYW5nZSwgaW50IGZsaXBwZXIpIHsKCWlmIChwYXJ0X2NvdW50IDwgcmFuZ2UpCgkJcmV0dXJuIGZhbHNlOwogCglpZiAocGFydF9udW0gPCAwIHx8IHBhcnRfY291bnQgPD0gMCkKCQlyZXR1cm4gZmFsc2U7CiAKCWlmIChwYXJ0X251bSA9PSAwIHx8IHBhcnRfbnVtID09IDEpCgkJcmV0dXJuIHRydWU7CiAKCWludCBmbGlwcGVkID0gcGFydF9udW0gXiBmbGlwcGVyOwoJaWYgKGZsaXBwZWQpCgkJcmV0dXJuIHRydWU7CiAKCWZvciAoaW50IGkgPSByYW5nZTsgaSA8IHBhcnRfY291bnQ7ICsraSkgewoJCWZsaXBwZXIgPSBmbGlwcGVyIDw8IDE7CgkJaWYgKGlzUG9zc2libGVIYXBweShwYXJ0X251bSwgcGFydF9jb3VudCwgcmFuZ2UgKyAxLCBmbGlwcGVyKSkKCQkJcmV0dXJuIHRydWU7Cgl9CiAKCXJldHVybiBmYWxzZTsKfQogCmJvb2wgY2hlY2tIYXBweShpbnQgdGFyZ2V0LCBpbnQgc2l6ZSwgaW50IHJhbmdlKSB7CglpbnQgcGFydF9udW0gPSAwOwoJaW50IHBhcnRfY291bnQgPSAwOwogCglmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewoJCSsrcGFydF9jb3VudDsKIAoJCXBhcnRfbnVtID0gcGFydF9udW0gPDwgMTsKIAoJCS8vIGlmIGJpdCBpcyBleGlzdAoJCWlmICh0YXJnZXQgJiAoMSA8PCAoc2l6ZSAtIGkgLSAxKSkpCgkJCXBhcnRfbnVtICs9IDE7CiAKCQljb3V0IDw8ICJwYXJ0X2NvdW50OiAiIDw8IHBhcnRfY291bnQgPDwgIiwgIjsJCgkJY291dCA8PCAicGFydF9udW06ICIgPDwgcGFydF9udW0gPDwgZW5kbDsKIAogCgkJaWYgKGlzUG9zc2libGVIYXBweShwYXJ0X251bSwgcGFydF9jb3VudCwgcmFuZ2UsIHJhbmdlXzFzKSkgewoJCQlpZiAoaSA9PSAoc2l6ZSAtIDEpKQoJCQkJcmV0dXJuIHRydWU7CiAKCQkJLy8gaW5pdGlhbHphdGlvbgkKCQkJaWYgKHBhcnRfbnVtID4gMSkgewoJCQkJcGFydF9udW0gPSAwOwoJCQkJcGFydF9jb3VudCA9IDA7CgkJCX0KCQl9Cgl9CiAKCXJldHVybiBmYWxzZTsKfQ==
original: 255
part_count: 1, part_num: 0
part_count: 2, part_num: 0
part_count: 3, part_num: 0
part_count: 4, part_num: 1
part_count: 5, part_num: 2
part_count: 1, part_num: 1
part_count: 2, part_num: 3
part_count: 3, part_num: 6
0
22