#include <string>
#include <set>
#include <vector>
#include <algorithm>
#include <iostream>
using std::set;
using std::string;
using std::begin;
using std::end;
using std::vector;
using std::cout;
vector<string> split(const string& s, const char d)
{
vector<string> split_str;
string buffer;
for_each(begin(s), end(s), [d, &split_str, &buffer](const char ch){
if (ch == d)
{
split_str.push_back(buffer);
buffer = "";
}
else
{
buffer += ch;
}
});
return split_str;
}
set<string> getUnique (const vector<string> v)
{
set<string> unique;
for_each(begin(v), end(v), [&unique](const string word){
unique.insert(word);
});
return unique;
}
string joinSet(const set<string> s, const char d)
{
string join_str {""};
for (set<string>::iterator it = s.begin(); it != s.end(); it++){
join_str += *it + d;
};
// erase last delimiter
join_str.erase(join_str.size(), 1);
return join_str;
}
std::string removeDuplicateWords(const std::string& str)
{
return joinSet(getUnique(split(str, ' ')), ' ');
}
int main()
{
cout << removeDuplicateWords("alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta");
// should return alpha beta gamma delta
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKCnVzaW5nIHN0ZDo6c2V0Owp1c2luZyBzdGQ6OnN0cmluZzsKdXNpbmcgc3RkOjpiZWdpbjsKdXNpbmcgc3RkOjplbmQ7CnVzaW5nIHN0ZDo6dmVjdG9yOwp1c2luZyBzdGQ6OmNvdXQ7CgoKCnZlY3RvcjxzdHJpbmc+IHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY29uc3QgY2hhciBkKQp7CiAgICB2ZWN0b3I8c3RyaW5nPiBzcGxpdF9zdHI7CiAgICBzdHJpbmcgYnVmZmVyOwogICAgCiAgICBmb3JfZWFjaChiZWdpbihzKSwgZW5kKHMpLCBbZCwgJnNwbGl0X3N0ciwgJmJ1ZmZlcl0oY29uc3QgY2hhciBjaCl7CiAgICAgICAgaWYgKGNoID09IGQpCiAgICAgICAgewogICAgICAgICAgICBzcGxpdF9zdHIucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgICAgICAgIGJ1ZmZlciA9ICIiOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBidWZmZXIgKz0gY2g7CiAgICAgICAgfQogICAgfSk7CiAgICAKICAgIHJldHVybiBzcGxpdF9zdHI7Cn0KCgoKc2V0PHN0cmluZz4gZ2V0VW5pcXVlIChjb25zdCB2ZWN0b3I8c3RyaW5nPiB2KQp7CiAgICBzZXQ8c3RyaW5nPiB1bmlxdWU7CiAgICBmb3JfZWFjaChiZWdpbih2KSwgZW5kKHYpLCBbJnVuaXF1ZV0oY29uc3Qgc3RyaW5nIHdvcmQpewogICAgICAgdW5pcXVlLmluc2VydCh3b3JkKTsgIAogICAgfSk7CiAgICAKICAgIHJldHVybiB1bmlxdWU7Cn0KCgoKc3RyaW5nIGpvaW5TZXQoY29uc3Qgc2V0PHN0cmluZz4gcywgY29uc3QgY2hhciBkKQp7CiAgICBzdHJpbmcgam9pbl9zdHIgeyIifTsKICAgIGZvciAoc2V0PHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcy5iZWdpbigpOyBpdCAhPSBzLmVuZCgpOyBpdCsrKXsKICAgICAgICBqb2luX3N0ciArPSAqaXQgKyBkOyAKICAgIH07CiAgICAKICAgIC8vIGVyYXNlIGxhc3QgZGVsaW1pdGVyCiAgICBqb2luX3N0ci5lcmFzZShqb2luX3N0ci5zaXplKCksIDEpOwoKICAgIHJldHVybiBqb2luX3N0cjsKfQoKCgpzdGQ6OnN0cmluZyByZW1vdmVEdXBsaWNhdGVXb3Jkcyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQp7CiAgICByZXR1cm4gam9pblNldChnZXRVbmlxdWUoc3BsaXQoc3RyLCAnICcpKSwgJyAnKTsKfQoKCmludCBtYWluKCkKewoJY291dCA8PCByZW1vdmVEdXBsaWNhdGVXb3JkcygiYWxwaGEgYmV0YSBiZXRhIGdhbW1hIGdhbW1hIGdhbW1hIGRlbHRhIGFscGhhIGJldGEgYmV0YSBnYW1tYSBnYW1tYSBnYW1tYSBkZWx0YSIpOwoJLy8gc2hvdWxkIHJldHVybiBhbHBoYSBiZXRhIGdhbW1hIGRlbHRhCn0=