// Solutions to the Advent Of Code 2024. // Copyright (C) 2025 Stefan Müller // // This program is free software: you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free Software // Foundation, either version 3 of the License, or (at your option) any later // version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along with // this program. If not, see . #pragma once #include #include #include class LinenTowelPatterns { public: LinenTowelPatterns(); void add(const std::string& towelPattern); int64_t countArrangements(const std::string& design); private: /// /// Tree data structure of all valid towel patterns. Each element is a vertex in the tree and represents a stripe in /// a towel pattern given by 's = i mod n', where 's' is the unique index offset of the stripe as defined in /// 'stripes_', 'i' is the index of the element, and 'n' is the number of stripes, i.e. the 'stripes_.size()'. /// The first value of each element indicates the next set of stripes to continue the pattern accumulated by /// following the path in the tree. If it is 0, this element is a leaf, and the pattern does not continue. /// Otherwise, it is the index of its first of 'n' children, which are contiguous in the vector. The second value of /// each element indicates whether there is a towel with the pattern ending at this element. /// std::vector> patterns_; /// /// Maps stripes (represented by chars) to an index offset in the tree of towel patterns. /// std::map stripes_; void addBranch(); };