#include <iostream>
#include <vector>
#include <cctype>
#include <map>
#include <stack>
struct Molecule
{
std::string name;
int count;
Molecule() : name(""), count(1) {}
Molecule(const std::string& name) : name(name), count(1) {}
Molecule(const std::string& name, int count) : name(name), count(count) {}
};
std::stack<Molecule> parseInput(const std::string& line);
int main()
{
std::string line;
while(getline(std::cin, line))
{
std::cout << line << std::endl;
auto stack = parseInput(line);
std::map<std::string, int> moleculeCount;
while(!stack.empty())
{
auto molecule = stack.top();
stack.pop();
moleculeCount[molecule.name] += molecule.count;
}
for(const auto& kv: moleculeCount)
std::cout << kv.first << " : " << kv.second << std::endl;
std::cout << std::endl;
}
return 0;
}
std::stack<Molecule> parseInput(const std::string& line)
{
std::stack<Molecule> stack;
size_t i = 0;
while(i < line.length() - 1)
{
char curr = line[i];
char next = line[i + 1];
if(std::isupper(curr) && std::islower(next))
{
if(i + 2 < line.length() && isdigit(line[i + 2]))
{
std::string name;
name += curr;
name += next;
Molecule molecule(name);
std::string number;
for(int j = i + 2; std::isdigit(line[j]); j++)
number += line[j];
molecule.count = std::stoi(number);
i += 2; //molecule name
i += number.length(); //following number
stack.push(molecule);
}
else
{
std::string name;
name += curr;
name += next;
Molecule molecule(name);
stack.push(molecule);
i += 2;
}
continue;
}
if(std::isupper(curr) && std::isdigit(next))
{
std::string name;
std::string number;
for(int j = i + 1; std::isdigit(line[j]); j++)
number += line[j];
name += curr;
Molecule molecule(name, std::stoi(number));
stack.push(molecule);
i += 1; //molecule name
i += number.length();
continue;
}
if(std::isupper(curr) && !std::isdigit(next))
{
std::string name;
name += curr;
Molecule molecule(name, 1);
stack.push(molecule);
i++;
continue;
}
if(curr == '(')
{
stack.push(Molecule("(", 0)); //probably not a good idea
i++;
continue;
}
if(curr == ')')
{
std::vector<Molecule> molecules;
int multiple = next - '0';
while(true)
{
auto molecule = stack.top();
stack.pop();
if(molecule.name == "(")
break;
molecules.push_back(molecule);
}
for(auto& m: molecules)
{
m.count *= multiple;
stack.push(m);
}
i += 2;
continue;
}
}
return stack;
}