【哈希和哈希表】图书管理
题目描述
图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入。为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统。
该系统需要支持 2 种操作:
该系统需要支持 2 种操作:
- add(s) 表示新加入一本书名为 s 的图书。
- find(s) 表示查询是否存在一本书名为 s 的图书。
输入
第一行包括一个正整数 n(n≤30000),表示操作数。 以下n行,每行给出 2 种操作中的某一个指令条,指令格式为:
add s
find s
在书名s与指令(add,find)之间有一个隔开,我们保证所有书名的长度都不超过200。可以假设读入数据是准确无误的。
add s
find s
在书名s与指令(add,find)之间有一个隔开,我们保证所有书名的长度都不超过200。可以假设读入数据是准确无误的。
输出
对于每个 find(s) 指令,我们必须对应的输出一行 yes 或 no,表示当前所查询的书是否存在于图书馆内。
注意:一开始时图书馆内是没有一本图书的。并且,对于相同字母不同大小写的书名,我们认为它们是不同的。
注意:一开始时图书馆内是没有一本图书的。并且,对于相同字母不同大小写的书名,我们认为它们是不同的。
【题解】:
利用链式前向星来模拟hash表的链,同时使用了双hash结构,代码是抄袭书本的。。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 3e5+10; 4 const int Mod1 = 1e6+3; 5 const int Mod2 = 1e6+9; 6 const int p1 = 47 ; 7 const int p2 = 79 ; 8 int cnt = 0 , Next[N+5],Head[Mod2+10],W[N]; 9 void Insert(int x,int y ){ 10 Next[++cnt] = Head[x] ; 11 Head[x] = cnt ; 12 W[cnt] = y ; 13 } 14 bool Query(int x,int y){ 15 for(int i=Head[x];i;i=Next[i]){ 16 if( W[i] == y ) return true; 17 } 18 return false ; 19 } 20 int main() 21 { 22 ios_base :: sync_with_stdio(NULL); 23 cin.tie(0),cout.tie(0); 24 int n; 25 char op[10],s[5006]; 26 cin >> n ; 27 while (n--) { 28 cin >> op ; 29 cin.getline(s,sizeof(s)); 30 int len = strlen(s); 31 long long sum1 = 0 ,sum2 = 0; 32 for(int i=0;i<len;i++){ 33 sum1 = ( sum1 * p1 + s[i] ) % Mod1; 34 sum2 = ( sum2 * p2 + s[i] ) % Mod2; 35 } 36 if ( op[0] == 'a' ){ 37 Insert(sum1,sum2); 38 }else{ 39 if( Query(sum1,sum2) ){ 40 printf("yes "); 41 }else{ 42 printf("no "); 43 } 44 } 45 } 46 return 0; 47 }