CodeForces - 589A (STL容器的使用)

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;
}

  





 
   


转载于:https://www.cnblogs.com/cglongge/p/9407659.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值