#include <algorithm>
#include <iostream>
#include <string>
#include <set>
template<class T>
class CompareWords {
public:
bool operator()(T s1, T s2) const
{
if (s1.length() == s2.length())
{
return ( s1 < s2 );
}
else return ( s1.length() < s2.length() );
}
};
typedef std::multiset<std::string, CompareWords<std::string>> mySet;
typedef std::multiset<std::string, CompareWords<std::string>>::iterator mySetItr;
void print_rec(const mySet& set, mySetItr it)
{
if (it == set.end()) {
return;
}
const auto& word = *it;
auto next = std::find_if(it, set.end(),
[&word](const std::string& s) {
return s != word;
});
std::cout << word << " appears " << std::distance(it, next) << std::endl;
print_rec(set, next);
}
void print(const mySet& set)
{
print_rec(set, set.begin());
}
int main (int argc, char* argv[])
{
mySet mWords = {"hello", "world", "Hi", "hello"};
print(mWords);
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c2V0PgoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgQ29tcGFyZVdvcmRzIHsKcHVibGljOgogICAgYm9vbCBvcGVyYXRvcigpKFQgczEsIFQgczIpIGNvbnN0CiAgICB7CiAgICAgICAgaWYgKHMxLmxlbmd0aCgpID09IHMyLmxlbmd0aCgpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICggczEgPCBzMiApOwogICAgICAgIH0KICAgICAgICBlbHNlIHJldHVybiAoIHMxLmxlbmd0aCgpIDwgczIubGVuZ3RoKCkgKTsKICAgIH0KfTsKdHlwZWRlZiBzdGQ6Om11bHRpc2V0PHN0ZDo6c3RyaW5nLCBDb21wYXJlV29yZHM8c3RkOjpzdHJpbmc+PiBteVNldDsKdHlwZWRlZiBzdGQ6Om11bHRpc2V0PHN0ZDo6c3RyaW5nLCBDb21wYXJlV29yZHM8c3RkOjpzdHJpbmc+Pjo6aXRlcmF0b3IgbXlTZXRJdHI7Cgp2b2lkIHByaW50X3JlYyhjb25zdCBteVNldCYgc2V0LCBteVNldEl0ciBpdCkKewogICAgaWYgKGl0ID09IHNldC5lbmQoKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGF1dG8mIHdvcmQgPSAqaXQ7CiAgICBhdXRvIG5leHQgPSBzdGQ6OmZpbmRfaWYoaXQsIHNldC5lbmQoKSwKICAgICAgICBbJndvcmRdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CiAgICAgICAgICAgIHJldHVybiBzICE9IHdvcmQ7CiAgICAgICAgfSk7CiAgICBzdGQ6OmNvdXQgPDwgd29yZCA8PCAiIGFwcGVhcnMgIiA8PCBzdGQ6OmRpc3RhbmNlKGl0LCBuZXh0KSA8PCBzdGQ6OmVuZGw7CiAgICBwcmludF9yZWMoc2V0LCBuZXh0KTsKfQoKdm9pZCBwcmludChjb25zdCBteVNldCYgc2V0KQp7CiAgICBwcmludF9yZWMoc2V0LCBzZXQuYmVnaW4oKSk7Cn0KCmludCBtYWluIChpbnQgYXJnYywgY2hhciogYXJndltdKQp7CiAgICBteVNldCBtV29yZHMgPSB7ImhlbGxvIiwgIndvcmxkIiwgIkhpIiwgImhlbGxvIn07CgogICAgcHJpbnQobVdvcmRzKTsKICAgIHJldHVybiAwOwp9Cg==