This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub noshi91/Library
#include "other/int_alias.cpp" #include <cassert> #include <cstddef> #include <numeric> #include <utility> #include <vector> class union_enumerate { std::vector<usize> next; public: union_enumerate() = default; union_enumerate(const usize size) : next(size) { std::iota(next.begin(), next.end(), static_cast<usize>(0)); } usize size() const { return next.size(); } std::vector<usize> enumerate(const usize x) const { assert(x < size()); std::vector<usize> ret; usize y = x; do { ret.push_back(y); y = next[y]; } while (y != x); return ret; } std::vector<std::vector<usize>> get_all() const { const usize n = size(); std::vector<std::vector<usize>> res; std::vector<bool> visited(n, false); for (usize i = 0; i != n; i += 1) { if (!visited[i]) { const std::vector<usize> list = enumerate(i); for (const usize j : list) visited[j] = true; res.push_back(list); } } return res; } void unite(const usize x, const usize y) { assert(x < size()); assert(y < size()); std::swap(next[x], next[y]); } }; /** * @brief Union Enumerate * @see http://noshi91.hatenablog.com/entry/2019/07/19/180606 */
#line 2 "other/int_alias.cpp" #include <cstddef> #include <cstdint> using i32 = std::int32_t; using i64 = std::int64_t; using u32 = std::uint32_t; using u64 = std::uint64_t; using isize = std::ptrdiff_t; using usize = std::size_t; #line 2 "data_structure/union_enumerate.cpp" #include <cassert> #line 5 "data_structure/union_enumerate.cpp" #include <numeric> #include <utility> #include <vector> class union_enumerate { std::vector<usize> next; public: union_enumerate() = default; union_enumerate(const usize size) : next(size) { std::iota(next.begin(), next.end(), static_cast<usize>(0)); } usize size() const { return next.size(); } std::vector<usize> enumerate(const usize x) const { assert(x < size()); std::vector<usize> ret; usize y = x; do { ret.push_back(y); y = next[y]; } while (y != x); return ret; } std::vector<std::vector<usize>> get_all() const { const usize n = size(); std::vector<std::vector<usize>> res; std::vector<bool> visited(n, false); for (usize i = 0; i != n; i += 1) { if (!visited[i]) { const std::vector<usize> list = enumerate(i); for (const usize j : list) visited[j] = true; res.push_back(list); } } return res; } void unite(const usize x, const usize y) { assert(x < size()); assert(y < size()); std::swap(next[x], next[y]); } }; /** * @brief Union Enumerate * @see http://noshi91.hatenablog.com/entry/2019/07/19/180606 */