大体题意:
告诉你n 个邮箱名称,求出不同邮箱种类的个数,并输出不同种类邮箱。
思路:
根据题意:
首先把输入的邮箱名字全部转换为小写。
邮箱是bmail.com的比较特别,他是根据第一个加号之前进行判别,并忽略点(dot),来进行分类!
其余的邮箱则是全部来作为依据!
直接建立一个map<string,int> 来判别有没有存在就好了,然后给种类一个id 放到vector 即可!
详细见代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 20000 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
map<string,int>mp;
int id = 0;
int a[maxn];
int vis[maxn];
char s[maxn][108];
char s2[maxn][108];
char code[107];
vector<string>v[maxn];
int main(){
int n;
scanf("%d",&n);
for (int i = 0; i < n; ++i){
scanf("%s",s2[i]);
strcpy(s[i],s2[i]);
for (int j = 0; s[i][j] != 0; ++j)s[i][j] = tolower(s[i][j]);
}
for (int i = 0; i < n; ++i){
int pat = 0;
for (;s[i][pat]!='@';++pat);
strcpy(code,s[i]);
if (strcmp(s[i]+pat+1,"bmail.com") == 0){
int dot = -1;
for (int j = 0; j < pat; ++j){
if (s[i][j] == '+'){
dot = j;
break;
}
}
int cnt = 0;
for (int j = 0; j < (dot == -1 ? pat : dot); ++j){
if (s[i][j] == '.')continue;
code[cnt++] = s[i][j];
}
code[cnt] = 0;
}
if (!mp.count(code)){
mp[code] = id;
v[id].push_back(s2[i]);
id++;
}
else{
v[mp[code]].push_back(s2[i]);
}
}
printf("%d\n",id);
for (int i = 0; i < id; ++i){
int len = v[i].size();
printf("%d",len);
for (int j = 0; j < len ; ++j)printf(" %s",v[i][j].c_str());
puts("");
}
return 0;
}