算法与数据结构实验题 9.2 寻人启事

1、题目:

2、AC代码:

#include<stdio.h>
#include<string.h>
#define size 1000003   //哈希表的长度,离1000000最近的素数  
#define n 6

struct Value{
	char *val;
	Value *next;
};

char name[size][n];
Value hash[size];

//计算hash值的算法 
int BKDRhash(char *s)
{
	int seed=131;
	__int64 hash =0;
	while(*s)
	{
		hash=hash*seed+(*s++);
	}
	return hash%size;
}

//查找是否存在相等的hash值  
bool Find(char *name)
{
	int t=BKDRhash(name);
	if(hash[t].val)
	{
		if(strcmp(name,hash[t].val)==0)//找到相等的hash值 
		{
			return true;
		}
		else
		{
			Value *v=hash[t].next;
			while(v)
			{
				if(strcmp(v->val,name)==0)
				return true;
				v=v->next; 
			}
		}
	}
	return false;
}


int main()
{
	int i,N,M,t;
	int ans=0;
	char str[6];
	Value *tmp;
	scanf("%d%d",&N,&M);
	for(i=0;i<size;i++)
	{
		hash[i].next=NULL;
		hash[i].val=NULL;
	}
	
	for(i=0;i<N;i++)	//实现插入 
	{
		scanf("%s",name[i]);
		t=BKDRhash(name[i]);
		if(hash[t].val==NULL)	//如果当前元素为空,则插入 
		{
			hash[t].val=name[i];
		}
		else	//若不为空,则插入到链表中 
		{
			tmp=new Value;
			tmp->val=name[i];
			tmp->next=hash[t].next;
			hash[t].next=tmp;
		}
	}
	//查找 
	for(i=0;i<M;i++)
	{
		scanf("%s",str);
		if(Find(str)==true)
		{
			ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}

3、一个TLE代码:

#include<stdio.h>
#include<string.h>
char name[1000001][10],str[1001][10];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int i,j;
	int count=0;
	for(i=0; i<n; i++)
	{
		scanf("%s",name[i]);
	}
	for(j=0; j<m; j++)
	{
		scanf("%s",str[j]);
		for(i=0; i<n; i++)
		{
			if(strcmp(name[i],str[j])==0)
			{
				count++;
				break; 
			}
		}
	}
	printf("%d\n",count);
	return 0;
}
posted @ 2016-11-20 17:42  laixl  阅读(322)  评论(0编辑  收藏  举报