题目链接: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 */