#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <algorithm>
#include <cctype>
#include <iterator>
#include <functional>
#include <ctime>
using namespace std;
const int INVALID = -1;
const vector<string> elem_names{
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al",
"Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe",
"Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y",
"Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb",
"Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd",
"Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir",
"Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac",
"Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No",
"Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl",
"Mc", "Lv", "Ts", "Og"
};
unordered_map<string, int> elem;
void spell(string const & s) {
const int q = s.size();
vector<int> has_repr(q + 1);
vector<vector<int>> repr(q + 1, vector<int>(3, INVALID));
has_repr[0] = true;
for (int i = 0; i <= q; ++i) {
if (!has_repr[i]) continue;
for (int j = 1; j <= 3; ++j) {
if (i + j > q) break;
auto iter = elem.find(s.substr(i, j));
if (iter != end(elem)) {
has_repr[i + j] = true;
repr[i + j][j - 1] = iter->second;
}
}
}
string out = s;
function<void(int)> dfs = [&](int i) {
if (!has_repr[i]) {
return;
}
if (!i) {
cout << out << '\n';
return;
}
for (int j = 1; j <= 3; ++j) {
int r = repr[i][j - 1];
if (r == INVALID) continue;
const string & name = elem_names[r];
copy(begin(name), end(name), begin(out) + i - j);
dfs(i - j);
}
};
dfs(q);
}
int main() {
for (int i = 0, ilen = elem_names.size(); i < ilen; ++i) {
string s = elem_names[i];
s[0] = tolower(s[0]);
elem[s] = i;
}
spell("amputation");
std::cout.setstate(std::ios_base::badbit);
clock_t tStart = clock();
for (int i = 0; i < 456976; ++i) {
int ii = i;
string s;
for (int j = 0; j < 4; ++j) {
s += 'a' + ii % 26;
ii /= 26;
}
spell(s);
}
cout.clear();
cout << double(clock() - tStart) / CLOCKS_PER_SEC << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNjdHlwZT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGN0aW1lPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IElOVkFMSUQgPSAtMTsKCmNvbnN0IHZlY3RvcjxzdHJpbmc+IGVsZW1fbmFtZXN7CgkiSCIsICJIZSIsICJMaSIsICJCZSIsICJCIiwgIkMiLCAiTiIsICJPIiwgIkYiLCAiTmUiLCAiTmEiLCAiTWciLCAiQWwiLAoJIlNpIiwgIlAiLCAiUyIsICJDbCIsICJBciIsICJLIiwgIkNhIiwgIlNjIiwgIlRpIiwgIlYiLCAiQ3IiLCAiTW4iLCAiRmUiLAoJIkNvIiwgIk5pIiwgIkN1IiwgIlpuIiwgIkdhIiwgIkdlIiwgIkFzIiwgIlNlIiwgIkJyIiwgIktyIiwgIlJiIiwgIlNyIiwgIlkiLAoJIlpyIiwgIk5iIiwgIk1vIiwgIlRjIiwgIlJ1IiwgIlJoIiwgIlBkIiwgIkFnIiwgIkNkIiwgIkluIiwgIlNuIiwgIlNiIiwKCSJUZSIsICJJIiwgIlhlIiwgIkNzIiwgIkJhIiwgIkxhIiwgIkNlIiwgIlByIiwgIk5kIiwgIlBtIiwgIlNtIiwgIkV1IiwgIkdkIiwKCSJUYiIsICJEeSIsICJIbyIsICJFciIsICJUbSIsICJZYiIsICJMdSIsICJIZiIsICJUYSIsICJXIiwgIlJlIiwgIk9zIiwgIklyIiwKCSJQdCIsICJBdSIsICJIZyIsICJUbCIsICJQYiIsICJCaSIsICJQbyIsICJBdCIsICJSbiIsICJGciIsICJSYSIsICJBYyIsCgkiVGgiLCAiUGEiLCAiVSIsICJOcCIsICJQdSIsICJBbSIsICJDbSIsICJCayIsICJDZiIsICJFcyIsICJGbSIsICJNZCIsICJObyIsCgkiTHIiLCAiUmYiLCAiRGIiLCAiU2ciLCAiQmgiLCAiSHMiLCAiTXQiLCAiRHMiLCAiUmciLCAiQ24iLCAiTmgiLCAiRmwiLAoJIk1jIiwgIkx2IiwgIlRzIiwgIk9nIgp9OwoKdW5vcmRlcmVkX21hcDxzdHJpbmcsIGludD4gZWxlbTsKCnZvaWQgc3BlbGwoc3RyaW5nIGNvbnN0ICYgcykgewoJY29uc3QgaW50IHEgPSBzLnNpemUoKTsKCXZlY3RvcjxpbnQ+IGhhc19yZXByKHEgKyAxKTsKCXZlY3Rvcjx2ZWN0b3I8aW50Pj4gcmVwcihxICsgMSwgdmVjdG9yPGludD4oMywgSU5WQUxJRCkpOwoJaGFzX3JlcHJbMF0gPSB0cnVlOwoJZm9yIChpbnQgaSA9IDA7IGkgPD0gcTsgKytpKSB7CgkJaWYgKCFoYXNfcmVwcltpXSkgY29udGludWU7CgkJZm9yIChpbnQgaiA9IDE7IGogPD0gMzsgKytqKSB7CgkJCWlmIChpICsgaiA+IHEpIGJyZWFrOwoJCQlhdXRvIGl0ZXIgPSBlbGVtLmZpbmQocy5zdWJzdHIoaSwgaikpOwoJCQlpZiAoaXRlciAhPSBlbmQoZWxlbSkpIHsKCQkJCWhhc19yZXByW2kgKyBqXSA9IHRydWU7CgkJCQlyZXByW2kgKyBqXVtqIC0gMV0gPSBpdGVyLT5zZWNvbmQ7CgkJCX0KCQl9Cgl9CgoJc3RyaW5nIG91dCA9IHM7CglmdW5jdGlvbjx2b2lkKGludCk+IGRmcyA9IFsmXShpbnQgaSkgewoJCWlmICghaGFzX3JlcHJbaV0pIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIWkpIHsKCQkJY291dCA8PCBvdXQgPDwgJ1xuJzsKCQkJcmV0dXJuOwoJCX0KCQlmb3IgKGludCBqID0gMTsgaiA8PSAzOyArK2opIHsKCQkJaW50IHIgPSByZXByW2ldW2ogLSAxXTsKCQkJaWYgKHIgPT0gSU5WQUxJRCkgY29udGludWU7CgkJCWNvbnN0IHN0cmluZyAmIG5hbWUgPSBlbGVtX25hbWVzW3JdOwoJCQljb3B5KGJlZ2luKG5hbWUpLCBlbmQobmFtZSksIGJlZ2luKG91dCkgKyBpIC0gaik7CgkJCWRmcyhpIC0gaik7CgkJfQoJfTsKCglkZnMocSk7Cn0KCmludCBtYWluKCkgewoJZm9yIChpbnQgaSA9IDAsIGlsZW4gPSBlbGVtX25hbWVzLnNpemUoKTsgaSA8IGlsZW47ICsraSkgewoJCXN0cmluZyBzID0gZWxlbV9uYW1lc1tpXTsKCQlzWzBdID0gdG9sb3dlcihzWzBdKTsKCQllbGVtW3NdID0gaTsKCX0KCQoJc3BlbGwoImFtcHV0YXRpb24iKTsKCglzdGQ6OmNvdXQuc2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6YmFkYml0KTsKCgljbG9ja190IHRTdGFydCA9IGNsb2NrKCk7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCA0NTY5NzY7ICsraSkgewoJCWludCBpaSA9IGk7CgkJc3RyaW5nIHM7CgkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKCQkJcyArPSAnYScgKyBpaSAlIDI2OwoJCQlpaSAvPSAyNjsKCQl9CgkJc3BlbGwocyk7Cgl9CgoJY291dC5jbGVhcigpOwoJY291dCA8PCBkb3VibGUoY2xvY2soKSAtIHRTdGFydCkgLyBDTE9DS1NfUEVSX1NFQyA8PCBlbmRsOwp9