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
",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
",count);
return 0;
}