EOJ(排序)——97. 邮件地址排序

97. 邮件地址排序

现接收到一大批电子邮件,邮件地址格式为:用户名@主机域名,要求把这些电子邮件地址做主机域名的字典序升序排序,如果主机域名相同,则做用户名的字典序降序排序。

输入

第一行输入一个正整数 n,表示共有 n 个电子邮件地址需要排序。
接下来 n 行,每行输入一个电子邮件地址(保证所有电子邮件地址的长度总和不超过 106)。
对于 50% 的数据,保证 n⩽100,|si|⩽100。
用户名只包含字母数字和下划线,主机域名只包含字母数字和点。

输出

按排序后的结果输出 n 行,每行一个电子邮件地址。

input

8
23485@qq.com
rieruer@163.com
39489384@qq.com
eruie@ecnu.edu.cn
rtff@163.com
84934804@qq.com
fdll@ecnu.edu.cn
598695@qq.com

output

rtff@163.com
rieruer@163.com
fdll@ecnu.edu.cn
eruie@ecnu.edu.cn
84934804@qq.com
598695@qq.com
39489384@qq.com
23485@qq.com

题目大意:

给出一些邮件地址,按域名和用户名排序。

题目解析:

用结构体存储数据,在读取数据时候用strtok函数分离用户名和主机域名,保存用户名和主机域名,然后利用qsort函数排序。(目测要用hash表来处理,加快查询速度,不过还没刷到那,下面代码只能过一半样例)

具体代码:

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;

struct address{
	char username[110];
	char adminname[110];
}arr[500];

int cmp(const void* a,const void* b){
	address add1=*(address*)a,add2=*(address*)b;
	if(strcmp(add1.adminname,add2.adminname)!=0)
		return strcmp(add1.adminname,add2.adminname);
	else
		return strcmp(add2.username,add1.username);
}

int main()
{
    int n;
    cin>>n;
    getchar();
    for(int i=0;i<n;i++){
    	char s[110];
    	cin.getline(s,110);
    	strcpy(arr[i].username,strtok(s, "@"));
    	strcpy(arr[i].adminname,strtok(NULL, "@"));
	}
	qsort(arr,n,sizeof(arr[0]),cmp);
	for(int i=0;i<n;i++){
    	printf("%s@%s\n",arr[i].username,arr[i].adminname);
	}
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务