poj 2503 qsort+bsearch

题意:输入一个英文单词+空格+外文单词,要求输入外文单词找到对应的英文单词,如果找不到输出eh.
因为单词的输入量是100000,并且还要考虑单词匹配的问题,所以简单的算法应该会超时,本人没有去写。
通过这道题学到了sscanf(),qsort(),bsearch()的用法,感觉比较爽,这道题就是把单词进行快排,有序了以后,然后再二分查找从而节省时间。
#include<iostream>
#include<stdlib.h>
using namespace std;
struct str
{
  char str1[11];//英文单词 
  char str2[11];//外文单词 
};
int q_cmp(const void *a,const void *b)
{
    return strcmp(((str*)a)->str2,((str*)b)->str2);
    //因为要快排外文单词,所以指向str2. 
}
int b_cmp(const void *a,const void *b)
{
    return strcmp((char*)a,((str*)b)->str2);
    //查找str2 
}
int main()
{
  str a[100005],*find;
  char word[25];
  int i=0,flag=0;
  while(gets(word))
  {
    if(word[0]=='\0'&&!flag)
    {
      qsort(a,i,sizeof(str),q_cmp);//题目中输入一个空行之后进行快排 
      flag=1;//同时标记赋值为1 
      continue;
    }
    if(!flag)
    {
      sscanf(word,"%s %s",a[i].str1,a[i].str2);
      //输入英文单词和外文单词,同时把单词分割赋值给结构体的str1,str2 
      i++;//下标加一 
    }
    if(flag)
    {
      find=(str*)bsearch(word,a,i,sizeof(str),b_cmp);
      //二分的查找空行之后的外文单词word,返回值是一个指向结构体类型的指针 
      if(find!=NULL) printf("%s\n",find->str1);//用指针指向输出英文单词 
      else printf("eh\n");
    }
  }
  //system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值