#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int numUniqueEmails(vector<string>& emails) {
string::iterator it;
cout << "Normalising the addresses:"<<endl;
for (int i = 0; i < emails.size(); i++) {
cout<<" "<<emails[i]<<"->";
for (it = emails[i].begin(); it!=emails[i].end() && *it != '@'; it++) {
cout<<*it; //ouch
if (*it == '.') {
emails[i].erase(it);
it--;
}
if (*it == '+') {
while (it!=emails[i].end() && *it != '@') {
emails[i].erase(it);
}
break;
}
}
cout<<"->"<<emails[i]<<endl; //ouch
}
cout << "Sorting."<<endl;
sort(emails.begin(), emails.end());
cout << "Remove dups."<<endl;
for (int j = 0; j < emails.size()-1; j++) {
if (emails[j] == emails[j + 1]) {
emails.erase(emails.begin() + j);
j--;
}
}
cout << "Sorted vector:"<<endl;
for (auto &x:emails)
cout<<" "<<x<<endl;
return emails.size();
}
};
int main() {
//vector<string> v { "hello@x.y", "darkness@y.z", "my.old.friend@z.w" };
//vector<string> v { "hello@x.y", "darkness@y.z", "hello@x.y" };
//vector<string> v { "hel.lo@x.y", "darkness@y.z", "hello@x.y", "my.old.friend@z.w","myoldfriend@z.w" };
vector<string> v { "", "hello", "darkness@", "hello@xy.", "dark.ness@" };
Solution s;
cout << s.numUniqueEmails(v)<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU29sdXRpb24gewogcHVibGljOgogIGludCBudW1VbmlxdWVFbWFpbHModmVjdG9yPHN0cmluZz4mIGVtYWlscykgewogICAgc3RyaW5nOjppdGVyYXRvciBpdDsKICAgIGNvdXQgPDwgIk5vcm1hbGlzaW5nIHRoZSBhZGRyZXNzZXM6Ijw8ZW5kbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW1haWxzLnNpemUoKTsgaSsrKSB7CiAgICAgIGNvdXQ8PCIgICI8PGVtYWlsc1tpXTw8Ii0+IjsKICAgICAgZm9yIChpdCA9IGVtYWlsc1tpXS5iZWdpbigpOyBpdCE9ZW1haWxzW2ldLmVuZCgpICYmICppdCAhPSAnQCc7IGl0KyspIHsKICAgICAgCWNvdXQ8PCppdDsgLy9vdWNoCiAgICAgICAgaWYgKCppdCA9PSAnLicpIHsKICAgICAgICAgIGVtYWlsc1tpXS5lcmFzZShpdCk7CiAgICAgICAgICBpdC0tOwogICAgICAgIH0KICAgICAgICBpZiAoKml0ID09ICcrJykgewogICAgICAgICAgd2hpbGUgKGl0IT1lbWFpbHNbaV0uZW5kKCkgJiYgKml0ICE9ICdAJykgewogICAgICAgICAgICBlbWFpbHNbaV0uZXJhc2UoaXQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvdXQ8PCItPiI8PGVtYWlsc1tpXTw8ZW5kbDsgLy9vdWNoCiAgICB9CiAgICBjb3V0IDw8ICJTb3J0aW5nLiI8PGVuZGw7IAogICAgc29ydChlbWFpbHMuYmVnaW4oKSwgZW1haWxzLmVuZCgpKTsKICAgIGNvdXQgPDwgIlJlbW92ZSBkdXBzLiI8PGVuZGw7IAogICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbWFpbHMuc2l6ZSgpLTE7IGorKykgewogICAgICAgIGlmIChlbWFpbHNbal0gPT0gZW1haWxzW2ogKyAxXSkgewogICAgICAgICAgZW1haWxzLmVyYXNlKGVtYWlscy5iZWdpbigpICsgaik7CiAgICAgICAgICBqLS07CiAgICAgICAgfQogICAgfQogICAgCiAgICBjb3V0IDw8ICJTb3J0ZWQgdmVjdG9yOiI8PGVuZGw7IAogICAgZm9yIChhdXRvICZ4OmVtYWlscykgCiAgICAgICAgY291dDw8IiAgIjw8eDw8ZW5kbDsKICAgIHJldHVybiBlbWFpbHMuc2l6ZSgpOwogIH0KfTsKCgppbnQgbWFpbigpIHsKCS8vdmVjdG9yPHN0cmluZz4gdiB7ICJoZWxsb0B4LnkiLCAiZGFya25lc3NAeS56IiwgIm15Lm9sZC5mcmllbmRAei53IiB9OyAKCS8vdmVjdG9yPHN0cmluZz4gdiB7ICJoZWxsb0B4LnkiLCAiZGFya25lc3NAeS56IiwgImhlbGxvQHgueSIgfTsgCgkvL3ZlY3RvcjxzdHJpbmc+IHYgeyAiaGVsLmxvQHgueSIsICJkYXJrbmVzc0B5LnoiLCAiaGVsbG9AeC55IiwgIm15Lm9sZC5mcmllbmRAei53IiwibXlvbGRmcmllbmRAei53IiB9OyAKCXZlY3RvcjxzdHJpbmc+IHYgeyAiIiwgImhlbGxvIiwgImRhcmtuZXNzQCIsICJoZWxsb0B4eS4iLCAiZGFyay5uZXNzQCIgfTsgCglTb2x1dGlvbiBzOyAKCWNvdXQgPDwgcy5udW1VbmlxdWVFbWFpbHModik8PGVuZGw7IAoJCglyZXR1cm4gMDsKfQ==