#include <iostream>
#include <algorithm>
#include <vector>
namespace stable {
template<class T>
void iter_swap(T a, T b)
{
T lo = std::min(a, b);
T hi = std::max(a, b);
if (*lo != *hi) {
auto loval = *lo;
auto hival = *hi;
for (auto it = lo + 1; it < hi; ++it) {
if (loval == *it) {
std::swap(loval, *it);
}
}
for (auto it = hi; it-- > lo; ) {
if (hival == *it) {
std::swap(hival, *it);
}
}
*lo = hival;
*hi = loval;
}
}
template<class T>
void reverse(T first, T last)
{
while (first != last && first != --last) {
stable::iter_swap(first++, last);
}
}
template<class T>
bool next_permutation(T first, T last)
{
auto r_first = std::make_reverse_iterator(last);
auto r_last = std::make_reverse_iterator(first);
auto left = std::is_sorted_until(r_first, r_last);
if (left != r_last){
auto right = std::upper_bound(r_first, left, *left);
stable::iter_swap(left, right);
}
stable::reverse(left.base(), last);
return left != r_last;
}
}
/*
* A wrapper around a string that compares the first letter only
*/
struct Stringlet {
std::string str;
bool operator <(const Stringlet& other) const
{
return (str[0] < other.str[0]);
}
bool operator ==(const Stringlet& other) const
{
return (str[0] == other.str[0]);
}
bool operator !=(const Stringlet& other) const
{
return (str[0] != other.str[0]);
}
};
std::ostream& operator<<(std::ostream& os, const Stringlet& s)
{
os << s.str;
return os;
}
template<class T>
void put(std::ostream& os, T first, T last)
{
size_t n = 0;
os << "[";
while (first < last) {
if (n++) os << ", ";
os << *first++;
}
os << "]\n";
}
int main(void)
{
Stringlet orig[] = {"1 ", "11", "2 ", "22", "2\"", "3 "};
size_t n = 4;
std::vector<Stringlet> pool;
for (size_t i = 0; i < n; i++) {
pool.push_back(orig[i]);
}
do {
put(std::cout, pool.begin(), pool.end());
} while (stable::next_permutation(pool.begin(), pool.end()));
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KCm5hbWVzcGFjZSBzdGFibGUgewogICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgIHZvaWQgaXRlcl9zd2FwKFQgYSwgVCBiKQogICAgewogICAgICAgIFQgbG8gPSBzdGQ6Om1pbihhLCBiKTsKICAgICAgICBUIGhpID0gc3RkOjptYXgoYSwgYik7CgogICAgICAgIGlmICgqbG8gIT0gKmhpKSB7CiAgICAgICAgICAgIGF1dG8gbG92YWwgPSAqbG87CiAgICAgICAgICAgIGF1dG8gaGl2YWwgPSAqaGk7CgogICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBsbyArIDE7IGl0IDwgaGk7ICsraXQpIHsKICAgICAgICAgICAgICAgIGlmIChsb3ZhbCA9PSAqaXQpIHsKICAgICAgICAgICAgICAgICAgICBzdGQ6OnN3YXAobG92YWwsICppdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGhpOyBpdC0tID4gbG87ICkgewogICAgICAgICAgICAgICAgaWYgKGhpdmFsID09ICppdCkgewogICAgICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChoaXZhbCwgKml0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgKmxvID0gaGl2YWw7CiAgICAgICAgICAgICpoaSA9IGxvdmFsOwogICAgICAgIH0KICAgIH0KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgdm9pZCByZXZlcnNlKFQgZmlyc3QsIFQgbGFzdCkKICAgIHsKICAgICAgICB3aGlsZSAoZmlyc3QgIT0gbGFzdCAmJiBmaXJzdCAhPSAtLWxhc3QpIHsKICAgICAgICAgICAgc3RhYmxlOjppdGVyX3N3YXAoZmlyc3QrKywgbGFzdCk7CiAgICAgICAgfQogICAgfQogICAgCgogICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgIGJvb2wgbmV4dF9wZXJtdXRhdGlvbihUIGZpcnN0LCBUIGxhc3QpCiAgICB7CiAgICAgICAgYXV0byByX2ZpcnN0ID0gc3RkOjptYWtlX3JldmVyc2VfaXRlcmF0b3IobGFzdCk7CiAgICAgICAgYXV0byByX2xhc3QgPSBzdGQ6Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihmaXJzdCk7CiAgICAgICAgYXV0byBsZWZ0ID0gc3RkOjppc19zb3J0ZWRfdW50aWwocl9maXJzdCwgcl9sYXN0KTsKCiAgICAgICAgaWYgKGxlZnQgIT0gcl9sYXN0KXsKICAgICAgICAgICAgYXV0byByaWdodCA9IHN0ZDo6dXBwZXJfYm91bmQocl9maXJzdCwgbGVmdCwgKmxlZnQpOwogICAgICAgICAgICBzdGFibGU6Oml0ZXJfc3dhcChsZWZ0LCByaWdodCk7CiAgICAgICAgfQoKICAgICAgICBzdGFibGU6OnJldmVyc2UobGVmdC5iYXNlKCksIGxhc3QpOwoKICAgICAgICByZXR1cm4gbGVmdCAhPSByX2xhc3Q7CiAgICB9Cn0KCi8qCiAqICAgICAgQSB3cmFwcGVyIGFyb3VuZCBhIHN0cmluZyB0aGF0IGNvbXBhcmVzIHRoZSBmaXJzdCBsZXR0ZXIgb25seQogKi8Kc3RydWN0IFN0cmluZ2xldCB7CiAgICBzdGQ6OnN0cmluZyBzdHI7CiAgICAKICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBTdHJpbmdsZXQmIG90aGVyKSBjb25zdAogICAgewogICAgICAgIHJldHVybiAoc3RyWzBdIDwgb3RoZXIuc3RyWzBdKTsKICAgIH0KICAgIAogICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBTdHJpbmdsZXQmIG90aGVyKSBjb25zdAogICAgewogICAgICAgIHJldHVybiAoc3RyWzBdID09IG90aGVyLnN0clswXSk7CiAgICB9CiAgICAKICAgIGJvb2wgb3BlcmF0b3IgIT0oY29uc3QgU3RyaW5nbGV0JiBvdGhlcikgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gKHN0clswXSAhPSBvdGhlci5zdHJbMF0pOwogICAgfQp9OwoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0cmluZ2xldCYgcykKewogICAgb3MgPDwgcy5zdHI7CiAgICByZXR1cm4gb3M7Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgcHV0KHN0ZDo6b3N0cmVhbSYgb3MsIFQgZmlyc3QsIFQgbGFzdCkKewogICAgc2l6ZV90IG4gPSAwOwogICAgb3MgPDwgIlsiOwogICAgCiAgICB3aGlsZSAoZmlyc3QgPCBsYXN0KSB7CiAgICAgICAgaWYgKG4rKykgb3MgPDwgIiwgIjsKICAgICAgICBvcyA8PCAqZmlyc3QrKzsKICAgIH0KICAgIAogICAgb3MgPDwgIl1cbiI7Cn0KCmludCBtYWluKHZvaWQpCnsKICAgIFN0cmluZ2xldCBvcmlnW10gPSB7IjEgIiwgIjExIiwgIjIgIiwgIjIyIiwgIjJcIiIsICIzICJ9OwogICAgc2l6ZV90IG4gPSA0OwoKICAgIHN0ZDo6dmVjdG9yPFN0cmluZ2xldD4gcG9vbDsKICAgIAogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBwb29sLnB1c2hfYmFjayhvcmlnW2ldKTsKICAgIH0KICAgIAogICAgZG8gewogICAgICAgIHB1dChzdGQ6OmNvdXQsIHBvb2wuYmVnaW4oKSwgcG9vbC5lbmQoKSk7CiAgICB9IHdoaWxlIChzdGFibGU6Om5leHRfcGVybXV0YXRpb24ocG9vbC5iZWdpbigpLCBwb29sLmVuZCgpKSk7CgogICAgcmV0dXJuIDA7Cn0K
[1 , 11, 2 , 22]
[1 , 2 , 11, 22]
[1 , 2 , 22, 11]
[2 , 1 , 11, 22]
[2 , 1 , 22, 11]
[2 , 22, 1 , 11]