#include <iostream>
#include <string>
using namespace std;
class NoNumLiteral {
// no literal !
public:
int numZero;
int numOne;
int numTwo;
int numEight;
int charCodeDot; // '.' = 0x2e
NoNumLiteral () {
numZero = numZero ^ numZero;
numOne = numZero;
numOne++;
numTwo = numOne + numOne;
numEight = numTwo * numTwo * numTwo;
charCodeDot = (numEight * numTwo) * (numTwo + numOne) - numTwo;
}
};
class DotString : public string, private NoNumLiteral {
public:
DotString() {}
DotString(const char *inStr) : string(inStr) {}
void decode() {
int bitCount;
char ch;
string decodeStr;
string::iterator ich = begin();
bitCount = numZero;
ch = numZero;
while (ich < end()) {
ch = (ch << numOne) + (*ich == charCodeDot);
if (++bitCount % numEight == numZero) {
decodeStr.append(numOne, ch);
ch = numZero;
}
ich++;
}
erase();
append(decodeStr);
}
void encode() {
// ...
}
void print() {
cout << (string&)(*this) << endl;
}
};
int main(void) {
// your code goes here
NoNumLiteral num;
// dots: bit stream eg. 'A' = 0x41 = 01000001 = "_._____."
DotString dots1("_.__.____..__._._.._..___.._..___.._....__._____");
DotString dots2("_._._..._.._...._...__.__.._..___..__.____.____.");
dots1.append(dots2);
dots1.print();
dots1.decode();
dots1.print();
return num.numZero;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE5vTnVtTGl0ZXJhbCB7CgkvLyBubyBsaXRlcmFsICEKCXB1YmxpYzoKCWludCBudW1aZXJvOwoJaW50IG51bU9uZTsKCWludCBudW1Ud287CglpbnQgbnVtRWlnaHQ7CglpbnQgY2hhckNvZGVEb3Q7ICAvLyAnLicgPSAweDJlCglOb051bUxpdGVyYWwgKCkgewoJIAludW1aZXJvID0gbnVtWmVybyBeIG51bVplcm87CgkgCW51bU9uZSAgPSBudW1aZXJvOwoJIAludW1PbmUrKzsKCSAJbnVtVHdvICA9IG51bU9uZSArIG51bU9uZTsKCSAJbnVtRWlnaHQgPSBudW1Ud28gKiBudW1Ud28gKiBudW1Ud287CgkgCWNoYXJDb2RlRG90ID0gKG51bUVpZ2h0ICogbnVtVHdvKSAqIChudW1Ud28gKyBudW1PbmUpIC0gbnVtVHdvOwoJfQp9OwoKY2xhc3MgRG90U3RyaW5nIDogcHVibGljIHN0cmluZywgcHJpdmF0ZSBOb051bUxpdGVyYWwgewogICAgcHVibGljOgogICAgRG90U3RyaW5nKCkge30KICAgIERvdFN0cmluZyhjb25zdCBjaGFyICppblN0cikgOiBzdHJpbmcoaW5TdHIpIHt9CiAgICAKICAgIHZvaWQgZGVjb2RlKCkgewogICAgIAlpbnQgIGJpdENvdW50OwogICAgIAljaGFyIGNoOwogICAgIAlzdHJpbmcgZGVjb2RlU3RyOwogICAgIAlzdHJpbmc6Oml0ZXJhdG9yIGljaCA9IGJlZ2luKCk7CiAgICAgCQogICAgIAliaXRDb3VudCA9IG51bVplcm87CiAgICAgCWNoID0gbnVtWmVybzsKICAgICAJd2hpbGUgKGljaCA8IGVuZCgpKSB7CgkJICAgIGNoID0gKGNoIDw8IG51bU9uZSkgKyAoKmljaCA9PSBjaGFyQ29kZURvdCk7CgkJICAgIGlmICgrK2JpdENvdW50ICUgbnVtRWlnaHQgPT0gbnVtWmVybykgewoJCQkgICAgZGVjb2RlU3RyLmFwcGVuZChudW1PbmUsIGNoKTsKCQkJICAgIGNoID0gbnVtWmVybzsKCQkgICAgfQoJCSAgICBpY2grKzsKICAgICAJfQogICAgIAllcmFzZSgpOwogICAgIAlhcHBlbmQoZGVjb2RlU3RyKTsKICAgIH0KICAgICAKICAgICB2b2lkIGVuY29kZSgpIHsKICAgICAJLy8gLi4uCiAgICAgfQogICAgIAogICAgIHZvaWQgcHJpbnQoKSB7CiAgICAgCWNvdXQgPDwgKHN0cmluZyYpKCp0aGlzKSA8PCBlbmRsOwogICAgIH0KfTsKCmludCBtYWluKHZvaWQpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCU5vTnVtTGl0ZXJhbCBudW07CgkKCS8vIGRvdHM6IGJpdCBzdHJlYW0gIGVnLiAnQScgPSAweDQxID0gMDEwMDAwMDEgPSAiXy5fX19fXy4iCglEb3RTdHJpbmcgZG90czEoIl8uX18uX19fXy4uX18uXy5fLi5fLi5fX18uLl8uLl9fXy4uXy4uLi5fXy5fX19fXyIpOwoJRG90U3RyaW5nIGRvdHMyKCJfLl8uXy4uLl8uLl8uLi4uXy4uLl9fLl9fLi5fLi5fX18uLl9fLl9fX18uX19fXy4iKTsKCQoJZG90czEuYXBwZW5kKGRvdHMyKTsKCWRvdHMxLnByaW50KCk7Cglkb3RzMS5kZWNvZGUoKTsKCWRvdHMxLnByaW50KCk7CgkKCXJldHVybiBudW0ubnVtWmVybzsKfQo=