#include <iostream>
#include <vector>
#include <unordered_set>
#include <string>
#include <algorithm>

std::vector<std::string> removeDupWordUnique(std::vector<std::string> strings) //O(n*log(n))
{
    std::sort(strings.begin(), strings.end());
    auto end = std::unique(strings.begin(), strings.end());
    strings.erase(end, strings.end());
    return strings;
}

std::vector<std::string> removeDupWordUnorderedSet(const std::vector<std::string>& strings) //O(n)
{
    std::unordered_set<std::string> unique(strings.begin(), strings.end());
    return std::vector<std::string>(unique.begin(), unique.end());
}


int main() {
	std::vector<std::string> duplicated = {"car", "plane", "bicycle", "car", "boat", "bike", "plane", "ship", "boat"};
	std::vector<std::string> cleared_by_unique = removeDupWordUnique(duplicated);
	std::vector<std::string> cleared_by_hashset = removeDupWordUnorderedSet(duplicated);
	std::cout<<"Original set: ";
	for(auto& i: duplicated)
		std::cout<<i<<", ";
	std::cout<<"\n";
	std::cout<<"Unique: ";
	for(auto& i: cleared_by_unique)
		std::cout<<i<<", ";
	std::cout<<"\n";
	std::cout<<"After hashset: ";
	for(auto& i: cleared_by_hashset)
		std::cout<<i<<", ";
	std::cout<<"\n";
	return 0;
}