fs.cpp
#include <iostream>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <string>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <utility>
#include <vector>
using namespace std;
#define DEBUG(x) cout << ">>> " #x << " : " << x << endl;
void transform(char chr, std::vector<bool> & crypt, std::vector<unsigned> & len)
{
bool T(true);
bool F(false);
switch(chr)
{
case 'A':
len.push_back(2);
crypt.push_back(F);
crypt.push_back(T);
break;
case 'B':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(F);
break;
case 'C':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(F);
break;
case 'D':
len.push_back(3);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(F);
break;
case 'E':
len.push_back(1);
crypt.push_back(F);
break;
case 'F':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(F);
break;
case 'G':
len.push_back(3);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(F);
break;
case 'H':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(F);
break;
case 'I':
len.push_back(2);
crypt.push_back(F);
crypt.push_back(F);
break;
case 'J':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(T);
break;
case 'K':
len.push_back(3);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(T);
break;
case 'L':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(F);
break;
case 'M':
len.push_back(2);
crypt.push_back(T);
crypt.push_back(T);
break;
case 'N':
len.push_back(2);
crypt.push_back(T);
crypt.push_back(F);
break;
case 'O':
len.push_back(3);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(T);
break;
case 'P':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(F);
break;
case 'Q':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(T);
break;
case 'R':
len.push_back(3);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(F);
break;
case 'S':
len.push_back(3);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(F);
break;
case 'T':
len.push_back(1);
crypt.push_back(T);
break;
case 'U':
len.push_back(3);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(T);
break;
case 'V':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(T);
break;
case 'W':
len.push_back(3);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(T);
break;
case 'X':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(T);
break;
case 'Y':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(T);
break;
case 'Z':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(F);
break;
case '_':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(T);
break;
case '.':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(F);
break;
case ',':
len.push_back(4);
crypt.push_back(F);
crypt.push_back(T);
crypt.push_back(F);
crypt.push_back(T);
break;
case '?':
len.push_back(4);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(T);
crypt.push_back(T);
break;
}
}
char decrypt(unsigned len, std::vector<bool>::iterator & cryptPos)
{
bool last(*cryptPos);
++cryptPos;
if (len > 1)
{
if (last)
{
last = *cryptPos;
++cryptPos;
if (len > 2)
{
if (last)
{
last = *cryptPos;
++cryptPos;
if (len > 3)
{
if (last)
{
last = *cryptPos;
++cryptPos;
if(last) // TTTT
return '?';
else // TTTF
return '.';
}
else
{
last = *cryptPos;
++cryptPos;
if(last) // TTFT
return 'Q';
else // TTFF
return 'Z';
}
}
else
{
if(last) // TTT
return 'O';
else // TTF
return 'G';
}
}
else
{
last = *cryptPos;
++cryptPos;
if (len > 3)
{
if (last)
{
last = *cryptPos;
++cryptPos;
if(last) // TFTT
return 'Y';
else // TFTF
return 'C';
}
else
{
last = *cryptPos;
++cryptPos;
if(last) // TFFT
return 'X';
else // TFFF
return 'B';
}
}
else
{
if(last) // TFT
return 'K';
else // TFF
return 'D';
}
}
}
else
{
if(last) // TT
return 'M';
else // TF
return 'N';
}
}
else
{
last = *cryptPos;
++cryptPos;
if (len > 2)
{
if (last)
{
last = *cryptPos;
++cryptPos;
if (len > 3)
{
if (last)
{
last = *cryptPos;
++cryptPos;
if(last) // FTTT
return 'J';
else // FTTF
return 'P';
}
else
{
last = *cryptPos;
++cryptPos;
if(last) // FTFT
return ',';
else // FTFF
return 'L';
}
}
else
{
if(last) // FTT
return 'W';
else // FTF
return 'R';
}
}
else
{
last = *cryptPos;
++cryptPos;
if (len > 3)
{
if (last)
{
last = *cryptPos;
++cryptPos;
if(last) // FFTT
return '_';
else // FFTF
return 'F';
}
else
{
last = *cryptPos;
++cryptPos;
if(last) // FFFT
return 'V';
else // FFFF
return 'H';
}
}
else
{
if(last) // FFT
return 'U';
else // FFF
return 'S';
}
}
}
else
{
if(last) // FT
return 'A';
else // FF
return 'I';
}
}
}
else
{
if(last)
return 'T';
else
return 'E';
}
}
std::string convert(std::string & str)
{
std::vector<bool> crypt;
std::vector<unsigned> len;
for (std::string::iterator pnter(str.begin()); pnter!=str.end(); ++pnter)
transform(*pnter, crypt, len);
std::vector<char> final;
std::vector<bool>::iterator cryptPos(crypt.begin());
for (std::vector<unsigned>::reverse_iterator pnter(len.rbegin()); pnter!=len.rend(); ++pnter)
{
final.push_back(decrypt(*pnter, cryptPos));
}
return std::string(final.begin(), final.end());
}
int main()
{
std::string line;
while (std::cin>>line)
{
std::cout << convert(line) << std::endl;
}
}