怎么快速查找我要的资料呢Submit: 4398 Accepted:800Time Limit: 2000MS Memory Limit: 65536K
Description
前不久,北影、中戏等艺术学院开始招生考试,初试结束后,校方会贴出一张大榜单,上面是通过初试获得复试资格的考生名单。考生和家长一大早都来看榜,但是一面墙那么大的名单,要看很久才能看完。怎么能快一些呢?一般来说,名单按姓氏笔画或拼音字母排序,是一张有序表,这就让我们想到了基于有序表的二分查找算法 binarysearch, 而我们学计算机的知道还有一种叫做 哈希 的方法 hash。
这个问题就是要求 Acmer 实现在名单中快速查找某一姓名的算法。
Input
输入数据分为名单和询问两部分。
首先是名单部分,第一行是一个正整数 n (n<=500000), 表示名单中的人数。下面 n 行, 每一行有一个由大写字母A-Z和小写字母a-z组成的字符串,代表名单中的姓名。
然后是询问部分,第一行是一个正整数 m (m<=10000), 表示询问的次数。下面 m 行, 每一行有一个由大写字母A-Z和小写字母a-z组成的字符串,代表要查询的姓名。
输入中的每个字符串长度不超过10。
Output
对于每一次查询,如果要查询的字符串出现在名单中输出 "YES", 否则输出 "NO"。(注意不要加引号)
每一次查询占一行。
Sample Input
5
abc
edfg
x
a
Mike
3
Mike
bc
EDFG
Sample Output
YES
NO
NO
Code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 500000
#define sz 11
int myComp(const void *p1,const void *p2){
return strcmp((char*)p1,(char*)p2);
}
int main(){
char name[N][sz],query[sz];
int manNum,qTime,i,j;
manNum=qTime=i=j=0;
scanf("%d",&manNum);
for(i=0;i<manNum;++i){
scanf("%s",name[i]);
}
qsort((void*)name,manNum,sizeof(query),myComp);
scanf("%d",&qTime);
for(i=0;i<qTime;++i){
scanf("%s",query);
if(NULL!=bsearch(query,name,manNum,sizeof(query),myComp)) printf("%s","YES/n");
else printf("%s","NO/n");
}
// system("pause");
return 0;
}
函数名:qsort
功 能: 使用快速排序例程进行排序
用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序
函数名: bsearch
功 能: 二分法搜索
用 法: void *bsearch(const void *key, const void *base, size_t *nelem, size_t width, int(*fcmp)(const void *, const *));
参数:第一个:要查找的关键字。第二个:要查找的数组。第三个:指定数组中元素的数目。第四个:每个元素的长度(以字符为单位)。
第五个:指向比较函数的指针。