#include <stdio.h>
#include <vector>
const char digitset[] = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void allocate_to_groups_impl( std::vector<char>& usage, std::vector<int>& order, const std::vector<int>& cumsum, int group, int place, int min )
{
if (place == cumsum[group]) {
group++; min = 0;
if (group == cumsum.size()) {
for( std::vector<int>::iterator it = order.begin(); it != order.end(); ++it )
putchar(digitset[*it]);
putchar('\n');
return;
}
}
for( int v = min, max = usage.size() + place - cumsum[group]; v <= max; ++v ) {
if (!usage[v]) {
order[place] = v;
usage[v] = 1;
allocate_to_groups_impl(usage, order, cumsum, group, place+1, v+1);
usage[v] = 0;
}
}
}
template<size_t Ngroups>
void allocate_to_groups( int (&c)[Ngroups] )
{
size_t sum_of_c = 0;
std::vector<int> cumsum_of_c;
for( int* it = c; it < c + Ngroups; ++it )
cumsum_of_c.push_back(sum_of_c += *it);
std::vector<int> order(sum_of_c);
std::vector<char> usage(sum_of_c);
allocate_to_groups_impl(usage, order, cumsum_of_c, 0, 0, 0);
}
int main(void)
{
int c[] = { 2, 3, 2 };
allocate_to_groups(c);
};
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx2ZWN0b3I+Cgpjb25zdCBjaGFyIGRpZ2l0c2V0W10gPSAiMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOwoKdm9pZCBhbGxvY2F0ZV90b19ncm91cHNfaW1wbCggc3RkOjp2ZWN0b3I8Y2hhcj4mIHVzYWdlLCBzdGQ6OnZlY3RvcjxpbnQ+JiBvcmRlciwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgY3Vtc3VtLCBpbnQgZ3JvdXAsIGludCBwbGFjZSwgaW50IG1pbiApCnsKICAgIGlmIChwbGFjZSA9PSBjdW1zdW1bZ3JvdXBdKSB7CiAgICAgICAgZ3JvdXArKzsgbWluID0gMDsKICAgICAgICBpZiAoZ3JvdXAgPT0gY3Vtc3VtLnNpemUoKSkgewogICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ID0gb3JkZXIuYmVnaW4oKTsgaXQgIT0gb3JkZXIuZW5kKCk7ICsraXQgKQogICAgICAgICAgICAgICAgcHV0Y2hhcihkaWdpdHNldFsqaXRdKTsKICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoIGludCB2ID0gbWluLCBtYXggPSB1c2FnZS5zaXplKCkgKyBwbGFjZSAtIGN1bXN1bVtncm91cF07IHYgPD0gbWF4OyArK3YgKSB7CiAgICAgICAgaWYgKCF1c2FnZVt2XSkgewogICAgICAgICAgICBvcmRlcltwbGFjZV0gPSB2OwogICAgICAgICAgICB1c2FnZVt2XSA9IDE7CiAgICAgICAgICAgIGFsbG9jYXRlX3RvX2dyb3Vwc19pbXBsKHVzYWdlLCBvcmRlciwgY3Vtc3VtLCBncm91cCwgcGxhY2UrMSwgdisxKTsKICAgICAgICAgICAgdXNhZ2Vbdl0gPSAwOwogICAgICAgIH0KICAgIH0KfQoKdGVtcGxhdGU8c2l6ZV90IE5ncm91cHM+CnZvaWQgYWxsb2NhdGVfdG9fZ3JvdXBzKCBpbnQgKCZjKVtOZ3JvdXBzXSApCnsKICAgIHNpemVfdCBzdW1fb2ZfYyA9IDA7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IGN1bXN1bV9vZl9jOwogICAgZm9yKCBpbnQqIGl0ID0gYzsgaXQgPCBjICsgTmdyb3VwczsgKytpdCApCiAgICAgICAgY3Vtc3VtX29mX2MucHVzaF9iYWNrKHN1bV9vZl9jICs9ICppdCk7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IG9yZGVyKHN1bV9vZl9jKTsKICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHVzYWdlKHN1bV9vZl9jKTsKCiAgICBhbGxvY2F0ZV90b19ncm91cHNfaW1wbCh1c2FnZSwgb3JkZXIsIGN1bXN1bV9vZl9jLCAwLCAwLCAwKTsKfQoKaW50IG1haW4odm9pZCkKewogICAgaW50IGNbXSA9IHsgMiwgMywgMiB9OwogICAgYWxsb2NhdGVfdG9fZ3JvdXBzKGMpOwp9Ow==