Polycarp has quite recently learned about email aliases. Of course, he used to suspect that the case of the letters doesn't matter in email addresses. He also learned that a popular mail server in Berland bmail.com ignores dots (characters '.') and all the part of an address from the first character "plus" ('+') to character "at" ('@') in a login part of email addresses.

Formally, any email address in this problem will look like "login@domain", where:

  • a "login" is a non-empty sequence of lowercase and uppercase letters, dots ('.') and pluses ('+'), which starts from a letter;
  • a "domain" is a non-empty sequence of lowercase and uppercase letters and dots, at that the dots split the sequences into non-empty words, consisting only from letters (that is, the "domain" starts from a letter, ends with a letter and doesn't contain two or more consecutive dots).

When you compare the addresses, the case of the characters isn't taken into consideration. Besides, when comparing the bmail.com addresses, servers ignore the dots in the login and all characters from the first character "plus" ('+') to character "at" ('@') in login part of an email address.

For example, addresses saratov@example.com and SaratoV@Example.Com correspond to the same account. Similarly, addresses ACM.ICPC.@bmail.comand A.cmIcpc@Bmail.Com also correspond to the same account (the important thing here is that the domains of these addresses are bmail.com). The next example illustrates the use of character '+' in email address aliases: addresses polycarp+contest@BMAIL.COM, Polycarp@bmail.comand polycarp++acm+icpc@Bmail.Com also correspond to the same account on the server bmail.com. However, addresses a@bmail.com.ru and a+b@bmail.com.ru are not equivalent, because '+' is a special character only for bmail.comaddresses.

Polycarp has thousands of records in his address book. Until today, he sincerely thought that that's exactly the number of people around the world that he is communicating to. Now he understands that not always distinct records in the address book represent distinct people.

Help Polycarp bring his notes in order by merging equivalent addresses into groups.

Input

The first line of the input contains a positive integer n (1 ≤ n ≤ 2·104) — the number of email addresses in Polycarp's address book.

The following n lines contain the email addresses, one per line. It is guaranteed that all of them are correct. All the given lines are distinct. The lengths of the addresses are from 3 to 100, inclusive.

Output

Print the number of groups k and then in k lines print the description of every group.

In the i-th line print the number of addresses in the group and all addresses that belong to the i-th group, separated by a space. It is allowed to print the groups and addresses in each group in any order.

Print the email addresses exactly as they were given in the input. Each address should go to exactly one group.

Examples

Input
6
ICPC.@bmail.com
p+con+test@BMAIL.COM
P@bmail.com
a@bmail.com.ru
I.cpc@Bmail.Com
a+b@bmail.com.ru
Output
4
2 ICPC.@bmail.com I.cpc@Bmail.Com
2 p+con+test@BMAIL.COM P@bmail.com
1 a@bmail.com.ru
1 a+b@bmail.com.ru
题意:给出你n个邮箱地址(由 登录名+@+域名组成),对于所有邮箱地址,他们忽视大小写的不同(AcB@qq.com和acb@Qq.CoM是同一个邮箱地址,acbc@qq.com和acb@qq.com不是同一个邮箱地址,因为他们登陆名不一样),
对于特殊域名bmail.com,它忽视登陆名中 所有的“.”和第一个“+”到“@”这部分的所有字符
(ICPC.@bmail.com和I.cpc@Bmail.Com 是同一个邮箱地址,p+con+test@BMAIL.COM和P@bmail.com也是同一个邮箱地址;a@bmail.com.ru和a+b@bmail.com.ru不是同一个邮箱地址,因为bmail.com.ru不是特殊域名,它不能忽略“+”到“@”这段的所有字符)
要你输出有多少个不同的邮箱地址,并把所有的相同邮箱地址输出在一起。
域名除字母大小写外要完全一样,字符数不能多也不能少,否则就是不同域名。例:“bmail.com.ru”和“bmail.com”就是不同域名
思路:把所有输入的邮箱地址字符串化为标准串,然后把标准串一样的字符串放在一起。
我是用map容器保存标准串,创建一个map<string,int>类型的容器,第一个位置存标准串,第二个位置存放该标准串对应的vector数组的序号,vector数组保存相同标准串的原字符串的下标,最后遍历所有vector数组输出答案。
map的使用方法:https://www.cnblogs.com/cglongge/p/8982556.html
vector的使用方法:http://www.cnblogs.com/cglongge/p/8569934.html
string的使用方法:http://www.cnblogs.com/cglongge/p/8987427.html
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
using namespace std;
struct st{//存放原字符串
string str;
}s[20010];
map<string,int> mp;//存放对于标准串的数组序号
struct{//存放相同标准串的原字符串的下标
vector<int> v;
}ans[20010];
string check(string a){
string b="moc.liamb@",c;//特殊域名
int i,j,k;
bool lg=false;
k=-1;
for(i=a.size()-1;i>=0&&k==-1;i--){//截取域名
if(a[i]=='@'){
c.push_back(a[i]);
k=i;
}
else{
if(a[i]>='A'&&a[i]<='Z')//化为标准串
a[i]+=32;
c.push_back(a[i]);
}
}
//cout<<" 1 "<<b<<endl;
//cout<<" 2 "<<c<<endl;
if(b==c){//是特殊域名
b.clear();
for(i=0;i<k;i++){
if(a[i]=='+')//去掉‘+’到‘@’这段字符串和‘. ’
break;
else if(a[i]>='A'&&a[i]<='Z'){
a[i]+=32;
b.push_back(a[i]);
}
else if(a[i]>='a'&&a[i]<='z'){
b.push_back(a[i]);
}
}
}
else{
b.clear();
for(i=0;i<k;i++){
if(a[i]>='A'&&a[i]<='Z'){
a[i]+=32;
b.push_back(a[i]);
}
else
b.push_back(a[i]);
}
}
reverse(c.begin(),c.end());
b=b+c;//得到标准串
return b;
}
int main(){
int n;
int i,j;
cin>>n;
string a;
int cnt;
cnt=0;
for(i=0;i<n;i++){
cin>>s[i].str;
a=check(s[i].str);
//cout<<a<<endl;
map<string,int>::iterator it;
it=mp.find(a);
if(it!=mp.end()){//如果有一样的标准串
ans[mp[a]].v.push_back(i);//放入对应序号的答案数组内
}
else{
mp.insert(pair<string,int>(a,cnt));//建立一个新的标准串和答案数组的连接
//cout<<a<<" "<<cnt<<endl;
ans[cnt].v.push_back(i);//
cnt++;
}
}
cout<<cnt<<endl;
for(i=0;i<cnt;i++){//输出一样的邮箱地址
int len=ans[i].v.size();
cout<<len;
for(j=0;j<len;j++){
cout<<" "<<s[ans[i].v[j]].str;
}
cout<<endl;
}
return 0;
}

  





CodeForces - 589A (STL容器的使用)的更多相关文章

  1. STL容器set用法以及codeforces 685B

    以前没怎么用过set,然后挂训练赛的时候发现set的妙用,结合网上用法一边学一边写. 首先set是一种容器,可以跟其他STL容器一样用 set<int > s 来定义, 它包含在STL头文 ...

  2. STL容器

    啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...

  3. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  4. STL容器删除元素的陷阱

    今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...

  5. 【转】c++中Vector等STL容器的自定义排序

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1. ...

  6. GDB打印STL容器内容

    GDB调试不能打印stl容器内容,下载此文件,将之保存为~/.gdbinit就可以使用打印命令了. 打印list用plist命令,打印vector用pvector,依此类推. (gdb) pvecto ...

  7. STL容器迭代器失效分析

    连续内存序列容器(vector, string, deque) 对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效, ...

  8. STL容器的适用情况

     转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...

  9. STL容器的遍历删除

    STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...

  10. STL容器与配接器

    STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector                             行为类似于数组,但可以根据要求 ...

随机推荐

  1. 线上bug分析

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...

  2. mybatis中的foreach方法

    select  t.service_id, t.prod_id, t.prod_name, t.prod_type, t.buss_type, t.pricing_fee, t.detail from ...

  3. vue 坑 checked 和v-model共用

    input type=checkbox 当使用v-model绑定某个变量了 ,只能通过绑定的这个变量来控制改input的value, 当:checked同时存在时 后者将无效: html <in ...

  4. Grunt: 拼接代码,js丑化(压缩),css压缩,html压缩,观察文件,拷贝文件,删除文件,压缩文件

    准备工作 grunt 基于nodeJs所以 nodeJs需要的基础配置都需要安装 1.Grunt 安装 npm install -g grunt-cli 这是全局安装 2.在当前文件下npm init ...

  5. ERROR 1666 (HY000): Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.

    centos7.5 binlog恢复数据失败 问题: mysql> \. /tmp/inc.sql ERROR 1050 (42S01): Table 'new_1' already exist ...

  6. Win32汇编学习(5):绘制文本2

    这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...

  7. Machine Learning--week2 多元线性回归、梯度下降改进、特征缩放、均值归一化、多项式回归、正规方程与设计矩阵

    对于multiple features 的问题(设有n个feature),hypothesis 应该改写成 \[ \mathit{h} _{\theta}(x) = \theta_{0} + \the ...

  8. 【IOS】#import和#include有什么区别,@class呢,#import<>跟#import ""有什么区别?

    1.#import是object-c导入头文件的关键字,#include是C/c++导入头文件的关键字,使用#import导入头文件会自动只导入一次,不会重复导入. 2.@class是告诉编译器某个类 ...

  9. From传值

    第一个Form,Form1: string value = string.Empty; using (Form2 frm = new Form2()) { if (frm.ShowDialog() = ...

  10. Javascript 字典应用实例

    字典时一个很有用的工具,在之前C#项目中有经常使用,这篇博文主要讲解在Javascript中,字典的实际应用场景 首先在JS中,是没有Dictionary‘类的,我们需要实现键值(KEY) -- 数值 ...