bupt1003

 

怎么快速查找我要的资料呢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 *)); 
参数:第一个:要查找的关键字。第二个:要查找的数组。第三个:指定数组中元素的数目。第四个:每个元素的长度(以字符为单位)。
第五个:指向比较函数的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值