Visitors hit counter dreamweaver

POJ 2503 字符串(两种方法)

   方法一:

          qsort+二分查找。先对字典根据外语来进行qsort.然后通过二分查找即可找到匹配的项。这里用到两个函数sscanf()和bsearch();

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

char str1[11],str2[11];
char str[25];

struct dict{
char en[11];
char fn[11];
}a[100005];

int q_cmp(const void*a,const void*b)
{
return strcmp(((dict*)a)->fn,((dict*)b)->fn);
}

int b_cmp(const void *a,const void *b)
{
return strcmp((char*)a,((dict*)b)->fn);
}

int main()
{
freopen("acm.txt","r",stdin);
int i=0;
int sign=1;
dict *p;
while(gets(str))
{

if(str[0]=='\0')
{
sign=0;
qsort(a,i,sizeof(dict),q_cmp);
continue;
}
if(sign)
{
sscanf(str,"%s %s",a[i].en,a[i].fn);
i++;
}
else
{
p=(dict*)bsearch(str,a,i,sizeof(dict),b_cmp);
if(p)
{
puts(p->en);
}
else
{
puts("eh");
}
}
}
return 0;
}


方法二: 通过ELFhash函数来做。冲突处理则是用到链表的方法。也不难。

#include <iostream>
#include <fstream>
#include <string.h>

#define N 100001
#define strSize 15

using namespace std;

struct hash{
bool used;
char fn[strSize],en[strSize];
hash* next; //用于冲突时构造链表
hash(){used=false; next=NULL;}
hash(char *f,char *e)
{
strcpy(fn,f);
strcpy(en,e);
used=false;
next=NULL;
}
}h[N];

int ELFhash(char *key){

unsigned long h=0;
unsigned long x=0;

while(*key)
{
h=(h<<4)+(*key++); //h左移4位,当前字符ASCII存入h的低四位
if( (x=h & 0xF0000000L)!=0)
{ //如果最高位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出
//因此要有如下处理
h^=(x>>24);
//清空28~31位
h&=~x;
}
}
return h % N;
}


int main()
{
freopen("acm.txt","r",stdin);
char str[30],en[strSize],fn[strSize];
hash* p;
int sign=1,key;

while(gets(str))
{
if(str[0]=='\0')
{
sign=0;
continue;
}
if(sign) //输入字典
{
sscanf(str,"%s %s",&en,&fn);
key=ELFhash(fn); //获取hash值
if(!h[key].used) //对应到hash表中
{
h[key].used=true;
strcpy(h[key].en,en);
strcpy(h[key].fn,fn);
}
else //处理冲突
{
p=&h[key];
while(p->next != NULL) p=p->next;
p->next=new hash(fn,en);
}

}
else //输入外文
{
key=ELFhash(str);
if(!h[key].used) printf("eh\n");
else
{
p=&h[key];
while(p!=NULL)
{
if(!strcmp(str,p->fn))
{
printf("%s\n",p->en);
break;
}
else
{
p=p->next;
}
}
if(p==NULL) printf("eh\n"); //不匹配的情况,不能少
}

}

}
return 0;
}

 

 

posted @ 2012-04-02 19:44  Jason Damon  阅读(1962)  评论(0编辑  收藏  举报