#include #include #include #include using namespace std; size_t collapse_polymer(vector polymer) { int react_diff = abs('a' - 'A'); size_t oldsize = 0; while(oldsize != polymer.size()) { oldsize = polymer.size(); for (size_t idx = 0; idx < polymer.size() - 1; ++idx) { if (abs(polymer[idx] - polymer[idx + 1]) == react_diff) { polymer.erase(polymer.begin() + idx, polymer.begin() + idx + 2); --idx; } } } return polymer.size(); } int main() { vector polymer { istreambuf_iterator(cin), istreambuf_iterator() }; cout << "Read polymer of size: " << polymer.size() << "\n"; size_t minsize = polymer.size(); for (size_t idx = 0; idx < 26; ++idx) { char current = 'a' + idx; vector filtered{polymer}; auto it = remove_if(filtered.begin(), filtered.end(), [=](char c) { if (c == current || c == toupper(current)) return true; return false; }); filtered.erase(it, filtered.end()); minsize = min(collapse_polymer(filtered), minsize); } cout << "Smallest collapsed polymer size: " << minsize << "\n"; }