題面
【題目描述】
圖書管理是一件十分繁雜的工作,圖書館每天都會有許多新書繳入,爲了更方便管理圖書(以便於幫助想要結束的客人快速查找是否有他們所需要的書),我們需要設計一個圖書朝着系統,該系統需要支持兩種操作:
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;
}