【題解】圖書管理(哈希表)

題面

【題目描述】
圖書管理是一件十分繁雜的工作,圖書館每天都會有許多新書繳入,爲了更方便管理圖書(以便於幫助想要結束的客人快速查找是否有他們所需要的書),我們需要設計一個圖書朝着系統,該系統需要支持兩種操作:
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; 
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章