题面
【题目描述】
图书管理是一件十分繁杂的工作,图书馆每天都会有许多新书缴入,为了更方便管理图书(以便于帮助想要结束的客人快速查找是否有他们所需要的书),我们需要设计一个图书朝着系统,该系统需要支持两种操作:
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;
}