#include <array>
#include <iostream>
template <std::size_t N>
bool increase(std::array<std::size_t, N>& a, std::size_t base)
{
for (auto rit = a.rbegin(); rit != a.rend(); ++rit) {
++*rit;
if (*rit != base) {
return true;
}
*rit = 0;
}
return false;
}
template <std::size_t N>
void print(std::array<std::size_t, N>& a, const char* symbols)
{
for (auto e : a) {
std::cout << symbols[e];
}
std::cout << std::endl;
}
int main()
{
const char symbols[] = "abcde";
std::array<std::size_t, 3> a{0};
do
{
print(a, symbols);
} while (increase(a, 5));
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KYm9vbCBpbmNyZWFzZShzdGQ6OmFycmF5PHN0ZDo6c2l6ZV90LCBOPiYgYSwgc3RkOjpzaXplX3QgYmFzZSkKewogICAgZm9yIChhdXRvIHJpdCA9IGEucmJlZ2luKCk7IHJpdCAhPSBhLnJlbmQoKTsgKytyaXQpIHsKICAgICAgICArKypyaXQ7CiAgICAgICAgaWYgKCpyaXQgIT0gYmFzZSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgKnJpdCA9IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgp2b2lkIHByaW50KHN0ZDo6YXJyYXk8c3RkOjpzaXplX3QsIE4+JiBhLCBjb25zdCBjaGFyKiBzeW1ib2xzKQp7CiAgICBmb3IgKGF1dG8gZSA6IGEpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgc3ltYm9sc1tlXTsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCgppbnQgbWFpbigpCnsKICAgIGNvbnN0IGNoYXIgc3ltYm9sc1tdID0gImFiY2RlIjsKICAgIHN0ZDo6YXJyYXk8c3RkOjpzaXplX3QsIDM+IGF7MH07CgogICAgZG8KICAgIHsKICAgICAgICBwcmludChhLCBzeW1ib2xzKTsKICAgIH0gd2hpbGUgKGluY3JlYXNlKGEsIDUpKTsKICAgIHJldHVybiAwOwp9Cg==