【题解】图书管理(哈希表)

题面

【题目描述】
图书管理是一件十分繁杂的工作,图书馆每天都会有许多新书缴入,为了更方便管理图书(以便于帮助想要结束的客人快速查找是否有他们所需要的书),我们需要设计一个图书朝着系统,该系统需要支持两种操作:
1)add(s),表示新加入一本书名为s的图书;
2)find(s),表示查询是否存在一本书名为s的图书;
【输入】
第一行包括一个正整数n(n≤30000),表示操作数。
以下n行,每行所给出两个操作中的一种,指令格式为:
add s
find s
在书名s与指令间有一个空格,保证书名长度都不超过200,可以加上读入数据是准确无误的。
【输出】
对于每个find指令,对应输出一行yes或no,表示该书是否存在。注意:开始时图书馆没有一本书,另外书名区分大小写。
【样例输入】

4
add InsideC#
find EffectiveJava
add EffectiveJava
find EffectiveJava

【样例输出】

no
yes

算法分析

哈希表,为了避免冲突,多用几个哈希函数。模数取小一点,使用桶进行统计是否出现过。

参考程序

46
#include<bits/stdc++.h>
#define M 299881 
#define Q 299983 
#define R 299993 
#define p 131 
using namespace std; 
int h1[300000],h2[300000],h3[300000],n;
char ch[30],book[250];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s%s",ch,book);
        //cout<<ch<<" "<<book<<endl;
        int len=strlen(book),t=0,tmp=0,k=0;
        for(int j=0;j<len;j++)
        {
            t=(t*p)%M+book[j];		//三哈希
            tmp=(tmp*p)%Q+book[j];
            k=(k*p)%R+book[j];
        }
        if(ch[0]=='a')
        {
            h1[t]=1;			//桶,统计
            h2[tmp]=1;
            h3[k]=1;
        }
        else
        {
            if(h1[t]&&h2[tmp]&&h3[k]) printf("yes\n");
            else printf("no\n");
        }
         
    }
    return 0; 
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章