#include <algorithm>
#include <iostream>
#include <cassert>
#include <vector>
#include <string>
template <typename Iterator, typename Compare>
void stable_toposort(Iterator begin, Iterator end, Compare cmp)
{
while (begin != end)
{
auto const new_begin = std::stable_partition(begin, end, [&](auto const& a)
{
return std::none_of(begin, end, [&](auto const& b) { return cmp(b, a); });
});
assert(new_begin != begin && "not a partial ordering");
begin = new_begin;
}
}
bool CompareItems(std::string const& item1, std::string const& item2)
{
if (item1[0] == 'C' && item2[0] == 'A') return true;
if (item1[0] == 'A' && item2[0] == 'B') return true;
return false;
}
int main()
{
std::vector<std::string> v = { "A1", "B", "C1", "A2", "A3", "F", "G", "C2", "H", "A4" };
stable_toposort(v.begin(), v.end(), CompareItems);
for (auto const& s : v)
{
std::cout << s << " ";
}
std::cout << "\n";
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvciwgdHlwZW5hbWUgQ29tcGFyZT4Kdm9pZCBzdGFibGVfdG9wb3NvcnQoSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCwgQ29tcGFyZSBjbXApCnsKICAgIHdoaWxlIChiZWdpbiAhPSBlbmQpCiAgICB7CiAgICAgICAgYXV0byBjb25zdCBuZXdfYmVnaW4gPSBzdGQ6OnN0YWJsZV9wYXJ0aXRpb24oYmVnaW4sIGVuZCwgWyZdKGF1dG8gY29uc3QmIGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc3RkOjpub25lX29mKGJlZ2luLCBlbmQsIFsmXShhdXRvIGNvbnN0JiBiKSB7IHJldHVybiBjbXAoYiwgYSk7IH0pOwogICAgICAgIH0pOwogICAgICAgIGFzc2VydChuZXdfYmVnaW4gIT0gYmVnaW4gJiYgIm5vdCBhIHBhcnRpYWwgb3JkZXJpbmciKTsKICAgICAgICBiZWdpbiA9IG5ld19iZWdpbjsKICAgIH0KfQoKYm9vbCBDb21wYXJlSXRlbXMoc3RkOjpzdHJpbmcgY29uc3QmIGl0ZW0xLCBzdGQ6OnN0cmluZyBjb25zdCYgaXRlbTIpCnsKICAgIGlmIChpdGVtMVswXSA9PSAnQycgJiYgaXRlbTJbMF0gPT0gJ0EnKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChpdGVtMVswXSA9PSAnQScgJiYgaXRlbTJbMF0gPT0gJ0InKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKQp7CglzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdiA9IHsgIkExIiwgIkIiLCAiQzEiLCAiQTIiLCAiQTMiLCAiRiIsICJHIiwgIkMyIiwgIkgiLCAiQTQiIH07CglzdGFibGVfdG9wb3NvcnQodi5iZWdpbigpLCB2LmVuZCgpLCBDb21wYXJlSXRlbXMpOwoJZm9yIChhdXRvIGNvbnN0JiBzIDogdikKCXsKCQlzdGQ6OmNvdXQgPDwgcyA8PCAiICI7Cgl9CglzdGQ6OmNvdXQgPDwgIlxuIjsKfQo=