题目链接:http://codeforces.com/problemset/problem/589/A
题意: 给定k个邮箱为这k个电子邮箱地址分类,地址格式均为login@domain。输出总类别数目,每个类别中地址的数目以及该类别中所有的地址。对于普通邮箱的地址来说,不区分大小写,只要字母相同就是同一类别,对于domain为@bmail.com的邮箱地址来说,也不区分大小写,忽略login部分所有的 '. '并且在login部分忽略第一个‘+’后面所有的字母一直到‘@’符号。
分析:我也没弄清这是个什么类型的题目,就是处理字符串的问题,只要细心点写应该没啥大问题。自己当时出错还是错在不够仔细,在写两个jdge函数时出了点问题。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
#include<vector>
#include<cmath>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 20000 + 10;
const double eps = 0.00000000000001;
vector<string> q[maxn];//将相同地址储存在同一个集合中
map<string ,int> mp;//为相同地址所在类别编号
char ch1[] = "bmail.com";
char s[110];;
int num;
int len;
char lower(char c)//将所有字母都变成小写形式便于判断
{
if(c == '@' || c == '.') return c;
if(c >= 'a' && c <= 'z') return c;
if(c >= 'A' && c <= 'Z') return c + 32;
return c;
}
bool check()//判断该邮箱地址是@bmail.com的特殊邮箱还是其他普通邮箱
{
int l = strlen(ch1);
for(int i = len - 1; s[i]; i--)
{
if(s[i] == '@')
break;
if(l < 0 || i < 0 || lower(s[i]) != ch1[--l])
return false;
}
return true;
}
void solve1()//对于特殊邮箱进行处理
{
char ss[110];//用于储存该特殊邮箱经过处理后变成的一般形式
int vis = 0;
int ff;
for(int i = 0; i < len; i++)
if(s[i] == '@') {ff = i; break;}
for(int i = 0; s[i] != '@'; i++)//在ss中储存第一个'+'前面的字母,忽略'.'
{
if(s[i] == '.') continue;
if(s[i] == '+') break;
ss[vis++] = lower(s[i]);
}
for(int i = ff; i < len; i++)//ss接着储存@以及之后的东西
ss[vis++] = lower(s[i]);
ss[vis] = 0;
if(mp[(string)ss] == 0) mp[(string)ss] = num++;
//cout << ss << " == " << mp[(string)ss] << endl;
q[mp[(string)ss]].push_back((string)s);//将相同地址储存在同一个集合中
}
void solve2()//对于一般邮箱进行处理
{
char ss[110];
int vis = 0;
for(int i = 0; i < len; i++)//直接将所有字母变成小写进行判断处理
ss[vis++] = lower(s[i]);
ss[vis] = 0;
if(mp[(string)ss] == 0) mp[(string)ss] = num++;
//cout << ss << " == " << mp[(string)ss] << endl;
q[mp[(string)ss]].push_back((string)s);
}
int main()
{
int k;
while(~scanf("%d",&k))
{
for(int i = 0; i < maxn; i++)
q[i].clear();
mp.clear();
num = 1;
while(k--)
{
memset(s, 0, sizeof(s));
scanf("%s",s);
len = strlen(s);
int flag = check();
if(flag)
solve1();
else
solve2();
}
printf("%d\n",num - 1);
for(int i = 1; i < num; i++)
{
int len1 = q[i].size();
printf("%d",len1);
for(int j = 0; j < len1; j++)
cout << " " << q[i][j];
printf("\n");
}
}
return 0;
}
/*
9
saratov@example.com
SaratoV@Example.Com
ACM.ICPC.@bmail.com
A.cmIcpc@Bmail.Com
polycarp+contest@BMAIL.COM
Polycarp@bmail.com
polycarp++acm+icpc@Bmail.Com
a@bmail.com.ru
a+b@bmail.com.ru
*/