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