#include <iostream>
#include <string>
#include <set>
#include <iomanip>
#include <iterator>
using Alphabet=std::set<char>;
using std::string;
using std::cout;
using std::endl;
using std::setw;
using std::next;
using std::make_pair;
Alphabet::iterator next_combination(const Alphabet& alphabet,const string::iterator& pos)
{
//находим в алфавите символ, который следует после символа, на который показывает pos
const auto newpos=next(alphabet.find(*pos));
//если такого символа нет - произошло переполнение. На место этого символа пишем первый символ алфавита, и начинаем сдвигать символ pos+1
*pos = *( newpos==alphabet.end() ? next_combination(alphabet,next(pos)) : newpos);
//всегда возвращаем первый символ алфавита
return begin(alphabet);
}
size_t intpower(const size_t base,size_t exp)
{
size_t ret=1;
for( ; exp-- ; ret*=base);
return ret;
}
int main()
{
//входной алфавит
const string alphabet_in="abcd";
//длина выходной строки
constexpr size_t length=4;
//загоняем алфавит во множество, гарантируем тем самым, что в нем нет дублей
const Alphabet alphabet(begin(alphabet_in),end(alphabet_in));
//печатаем все комбинации
for(
//первоначально, заполняем массив первым символом алфавита
auto context=make_pair(string(length,*alphabet.begin()),intpower(alphabet.size(),length));
cout << setw(10) << context.second-- << '\t' << context.first << endl, //печатаем порядковый номер и комбинацию
next_combination(alphabet,begin(context.first)), //формируем следующую комбинацию
context.second //продолжаем, если счетчик оставшихся комбинаций отличен от 0
;
);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKdXNpbmcgQWxwaGFiZXQ9c3RkOjpzZXQ8Y2hhcj47CnVzaW5nIHN0ZDo6c3RyaW5nOwp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6ZW5kbDsKdXNpbmcgc3RkOjpzZXR3Owp1c2luZyBzdGQ6Om5leHQ7CnVzaW5nIHN0ZDo6bWFrZV9wYWlyOwoKQWxwaGFiZXQ6Oml0ZXJhdG9yIG5leHRfY29tYmluYXRpb24oY29uc3QgQWxwaGFiZXQmIGFscGhhYmV0LGNvbnN0IHN0cmluZzo6aXRlcmF0b3ImIHBvcykKewogICAgLy/QvdCw0YXQvtC00LjQvCDQsiDQsNC70YTQsNCy0LjRgtC1INGB0LjQvNCy0L7Quywg0LrQvtGC0L7RgNGL0Lkg0YHQu9C10LTRg9C10YIg0L/QvtGB0LvQtSDRgdC40LzQstC+0LvQsCwg0L3QsCDQutC+0YLQvtGA0YvQuSDQv9C+0LrQsNC30YvQstCw0LXRgiBwb3MKICAgIGNvbnN0IGF1dG8gbmV3cG9zPW5leHQoYWxwaGFiZXQuZmluZCgqcG9zKSk7CiAgICAvL9C10YHQu9C4INGC0LDQutC+0LPQviDRgdC40LzQstC+0LvQsCDQvdC10YIgLSDQv9GA0L7QuNC30L7RiNC70L4g0L/QtdGA0LXQv9C+0LvQvdC10L3QuNC1LiDQndCwINC80LXRgdGC0L4g0Y3RgtC+0LPQviDRgdC40LzQstC+0LvQsCDQv9C40YjQtdC8INC/0LXRgNCy0YvQuSDRgdC40LzQstC+0Lsg0LDQu9GE0LDQstC40YLQsCwg0Lgg0L3QsNGH0LjQvdCw0LXQvCDRgdC00LLQuNCz0LDRgtGMINGB0LjQvNCy0L7QuyBwb3MrMQogICAgKnBvcyA9ICAqKCBuZXdwb3M9PWFscGhhYmV0LmVuZCgpID8gbmV4dF9jb21iaW5hdGlvbihhbHBoYWJldCxuZXh0KHBvcykpIDogbmV3cG9zKTsKICAgIC8v0LLRgdC10LPQtNCwINCy0L7Qt9Cy0YDQsNGJ0LDQtdC8INC/0LXRgNCy0YvQuSDRgdC40LzQstC+0Lsg0LDQu9GE0LDQstC40YLQsAogICAgcmV0dXJuIGJlZ2luKGFscGhhYmV0KTsKfQoKc2l6ZV90IGludHBvd2VyKGNvbnN0IHNpemVfdCBiYXNlLHNpemVfdCBleHApCnsKICAgIHNpemVfdCByZXQ9MTsKICAgIGZvciggOyBleHAtLSA7IHJldCo9YmFzZSk7CiAgICByZXR1cm4gcmV0Owp9CgppbnQgbWFpbigpCnsKICAgIC8v0LLRhdC+0LTQvdC+0Lkg0LDQu9GE0LDQstC40YIKICAgIGNvbnN0IHN0cmluZyBhbHBoYWJldF9pbj0iYWJjZCI7CiAgICAvL9C00LvQuNC90LAg0LLRi9GF0L7QtNC90L7QuSDRgdGC0YDQvtC60LgKICAgIGNvbnN0ZXhwciBzaXplX3QgbGVuZ3RoPTQ7CiAgICAvL9C30LDQs9C+0L3Rj9C10Lwg0LDQu9GE0LDQstC40YIg0LLQviDQvNC90L7QttC10YHRgtCy0L4sINCz0LDRgNCw0L3RgtC40YDRg9C10Lwg0YLQtdC8INGB0LDQvNGL0LwsINGH0YLQviDQsiDQvdC10Lwg0L3QtdGCINC00YPQsdC70LXQuQogICAgY29uc3QgQWxwaGFiZXQgYWxwaGFiZXQoYmVnaW4oYWxwaGFiZXRfaW4pLGVuZChhbHBoYWJldF9pbikpOwogICAgLy/Qv9C10YfQsNGC0LDQtdC8INCy0YHQtSDQutC+0LzQsdC40L3QsNGG0LjQuAogICAgZm9yKAogICAgICAgICAgICAvL9C/0LXRgNCy0L7QvdCw0YfQsNC70YzQvdC+LCDQt9Cw0L/QvtC70L3Rj9C10Lwg0LzQsNGB0YHQuNCyINC/0LXRgNCy0YvQvCDRgdC40LzQstC+0LvQvtC8INCw0LvRhNCw0LLQuNGC0LAKICAgICAgICAgICAgYXV0byBjb250ZXh0PW1ha2VfcGFpcihzdHJpbmcobGVuZ3RoLCphbHBoYWJldC5iZWdpbigpKSxpbnRwb3dlcihhbHBoYWJldC5zaXplKCksbGVuZ3RoKSk7CiAgICAgICAgICAgICAgICBjb3V0IDw8IHNldHcoMTApIDw8IGNvbnRleHQuc2Vjb25kLS0gPDwgJ1x0JyA8PCBjb250ZXh0LmZpcnN0IDw8IGVuZGwsIC8v0L/QtdGH0LDRgtCw0LXQvCDQv9C+0YDRj9C00LrQvtCy0YvQuSDQvdC+0LzQtdGAINC4INC60L7QvNCx0LjQvdCw0YbQuNGOCiAgICAgICAgICAgICAgICBuZXh0X2NvbWJpbmF0aW9uKGFscGhhYmV0LGJlZ2luKGNvbnRleHQuZmlyc3QpKSwgICAgICAgICAgICAgICAgLy/RhNC+0YDQvNC40YDRg9C10Lwg0YHQu9C10LTRg9GO0YnRg9GOINC60L7QvNCx0LjQvdCw0YbQuNGOCiAgICAgICAgICAgICAgICBjb250ZXh0LnNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/Qv9GA0L7QtNC+0LvQttCw0LXQvCwg0LXRgdC70Lgg0YHRh9C10YLRh9C40Log0L7RgdGC0LDQstGI0LjRhdGB0Y8g0LrQvtC80LHQuNC90LDRhtC40Lkg0L7RgtC70LjRh9C10L0g0L7RgiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICk7CgogICAgcmV0dXJuIDA7Cn0KCg==