单词拼写检查

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


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


【代码】

//单词拼写检查
#include
#include
#include
#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 

你可能感兴趣的:(hash)