给定n个单词(n <=10000)
给定m个查找
输出无法查找见的单词的个数


【分析】
貌似是哈希表的入门题?(我觉得好难。。)
做哈希表需要一些技巧的,大概就是对单词的首、中、尾的字符顺序码加权,方便插入也方便查找。
遇到be和bee这种单词可能费一些时间,不过总的来说还是很快的。


【代码】

//单词拼写检查
#include<iostream>
#include<cstdio>
#include<cstring>
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int maxn=19997;
int tot;
string h[maxn+1];
int hash(string x)
{
int t,l,m;
l=x.size();
m=l/2;
t=(x[0]-'a')*10000+(x[m]-'a')*100+(x[l-1]-'a');
return t%maxn;
}
void insert(string word)
{
int t=hash(word);
while(h[t]!="" && h[t]!=word) //若t未被访问过
{
t++;
if(t==maxn)
t=0;
}
h[t]=word;
}
void find(string word)
{
int t=hash(word);
while(h[t]!="" && h[t]!=word)
{
t++;
if(t==maxn)
t=0;
}
if(h[t]=="") tot++;
}
int main()
{
int n,i,j,k;
string word;
scanf("%d",&n);
fo(i,1,n)
{
cin>>word;
insert(word);
}
scanf("%d",&n);
fo(i,1,n)
{
cin>>word;
find(word);
}
printf("%d\n",tot);
return 0;
}
//样例输入:
//5
//apple
//be
//love
//up
//down
//3
//up
//down
//bee
//样例输出:
//1