#define USE_ORDERED_STATISTICS #define BIG_BIGINT #include #ifdef USE_ORDERED_STATISTICS #include #include using namespace __gnu_pbds; #endif using namespace std; typedef long long int ll; #ifdef BIG_BIGINT typedef __int128_t bigint; #else typedef ll bigint; #endif typedef pair pi; typedef pair pl; typedef vector vi; typedef vector vl; typedef vector vvi; typedef vector vvl; typedef vector vpi; typedef vector vpl; typedef vector vvpi; typedef vector vvpl; typedef set si; typedef multiset msi; typedef set sl; typedef multiset msl; typedef long double ld; template using func = function; #ifdef USE_ORDERED_STATISTICS typedef tree< pl, null_type, less, rb_tree_tag, tree_order_statistics_node_update> ordered_set; #endif #define clrcin cin.ignore(numeric_limits::max(),'\n'); #define GOGOGO ios::sync_with_stdio(false); cin.tie(nullptr); #define BYEBYE return 0; #define all(cn) (cn).begin(), (cn).end() #define rep(i, n) for (int i = 0; i < n; ++i) #define csz(c) ((int)c.size()) #define mp make_pair #define eb emplace_back #define fi first #define se second #define popcnt __builtin_popcount #define popcntll __builtin_popcount_ll const int INFI = 1e9 + 5; const ll INFL = 1e18 + 5; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); auto dist = uniform_int_distribution(0, INFI); auto distll = uniform_int_distribution(0, INFL); int rnd() { return dist(rng); } ll rndl() { return distll(rng); } #define pb pop_back #define vvc vector> #define back push_back using namespace std; void print(const vvc& partition) { for (const auto& subset : partition) { cout << "{ "; for (char item : subset) { cout << item << " "; } cout << "} "; } cout << endl; } void help(vvc& cp, const string& elements, int n, int k, int idx) { if (idx == n) { if (k == 0 || cp.size() == k) { print(cp); } return; } for (int i = 0; i < cp.size(); ++i) { cp[i].back(elements[idx]); help(cp, elements, n, k, idx + 1); cp[i].pb(); } if (k == 0 || cp.size() < k) { cp.back({elements[idx]}); help(cp, elements, n, k, idx + 1); cp.pb(); } } void gen(const string& elements, int k = 0) { vvc cp; help(cp, elements, elements.size(), k, 0); } int main() { string elements = "abc"; gen(elements, 2); gen(elements); return 0; }