· 9 years ago · Oct 03, 2016, 01:42 PM
1#include <iostream>
2#include <unordered_map>
3#include <string>
4#include <vector>
5#include <algorithm>
6
7using namespace std;
8
9int main() {
10 unordered_map<string, vector <string>> my_map;
11 int n;
12 cin >> n;
13 string str;
14
15 for (int i = 0; i < n; i++)
16 {
17 cin >> str;
18 string newstring = "";
19 string strorigin = str;
20 transform (str.begin(), str.end(), str.begin(), ::tolower);
21 int pos = str.find('@');
22 if (!str.compare(pos, str.size() - pos, "@gmail.com"))
23 {
24 string empty = "";
25 auto iter1 = str.begin();
26 auto iter2 = str.begin();
27 bool has_plus = false;
28 while (*iter1 != '@') {
29 if (*iter1 == '+') {
30 has_plus = true;
31 }
32 if (!has_plus) {
33 if (*iter1 == '.') {
34 iter1++;
35 } else {
36 *iter2 = *iter1;
37 iter1++;
38 iter2++;
39 }
40 } else {
41 iter1++;
42 }
43 }
44 while (iter1 != str.end()) {
45 *iter2 = *iter1;
46 iter1++;
47 iter2++;
48 }
49 str.replace(iter2, iter1, empty.begin(), empty.end());
50 }
51 if (my_map.find(str) == my_map.end())
52 {
53 my_map[str] = vector<string>();
54 }
55 my_map[str].push_back(strorigin);
56 }
57 cout << my_map.size() << endl;
58 for (const auto &item0 :my_map)
59 {
60 cout << item0.second.size();
61 for (size_t i = 0; i < item0.second.size(); i++)
62 {
63 cout << ' ' << item0.second[i];
64 }
65 cout << endl;
66 }
67 return 0;
68}