#include <iostream>
#include <string>
#include <vector>
bool increase(const std::vector<std::string>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] == v[index].size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
void do_job(const std::vector<std::string>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = v.size(); i != size; ++i) {
std::cout << v[i][it[i]];
}
std::cout << std::endl;
}
void iterate(const std::vector<std::string>& v)
{
std::vector<std::size_t> it(v.size(), 0);
do {
do_job(v, it);
} while (increase(v, it));
}
int main()
{
const std::vector<std::string> v{"b", "ACD", "12"};
iterate(v);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgogCmJvb2wgaW5jcmVhc2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB2LCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0KQp7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwLCBzaXplID0gaXQuc2l6ZSgpOyBpICE9IHNpemU7ICsraSkgewogICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGluZGV4ID0gc2l6ZSAtIDEgLSBpOwogICAgICAgICsraXRbaW5kZXhdOwogICAgICAgIGlmIChpdFtpbmRleF0gPT0gdltpbmRleF0uc2l6ZSgpKSB7CiAgICAgICAgICAgIGl0W2luZGV4XSA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CiAKdm9pZCBkb19qb2IoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB2LCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0KQp7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwLCBzaXplID0gdi5zaXplKCk7IGkgIT0gc2l6ZTsgKytpKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHZbaV1baXRbaV1dOwogICAgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQogCnZvaWQgaXRlcmF0ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHYpCnsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBpdCh2LnNpemUoKSwgMCk7CiAKICAgIGRvIHsKICAgICAgICBkb19qb2IodiwgaXQpOwogICAgfSB3aGlsZSAoaW5jcmVhc2UodiwgaXQpKTsKfQogCmludCBtYWluKCkKewogICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZ7ImIiLCAiQUNEIiwgIjEyIn07CiAgICBpdGVyYXRlKHYpOwp9