題解0011:圖書管理(哈希、vector)

信奧一本通——哈希 里的例題2

題目鏈接://ybt.ssoier.cn:8088/problem_show.php?pid=1456

題目描述:兩個命令,一個是進一本名字為s的圖書,一個是找現有的圖書里有沒有名字為s的圖書,如果有輸出 「噎死」 「yes」,沒有輸出 「no」 。

這道題基礎思路是用哈希,將書名的字元串轉換成相應的哈希值,再進行查找。

但是

書名的長度最長200,這麼大的字元串哈希值看著都腿軟。

那怎麼辦呢?

在c++中有一種數據結構叫vector,是一個動態2維數組,可以將一維的數向下擴充成2維(甚至三維)。

那麼,我們就可以在哈希的基礎上,用vector進行進一步判斷了。

將某串的哈希值模上個質數,然後將原串存在相應 vector [哈希值] 的地方

就像這樣:

 

v[we/*相應哈希值*/].push_back(a);

 

 

 

下面完整程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int b=31;//工具質數 
 4 int we,q;
 5 string a,c;
 6 vector<string> v[30000];//必須是string類型的 
 7 int main(){
 8     int n;
 9     cin>>n;
10     for(int i=0;i<n;i++){
11         cin>>c;
12         if(c=="add"){
13             getline(cin,a);//因為有空格,所以用這個 
14             we=1;
15             for(int j=0;j<a.size();j++){
16                 we=(we*b+(long long)a[j])%23333;//求哈希值 
17             }
18             v[we].push_back(a);//將字元串存進去 
19         }
20         if(c=="find"){
21             getline(cin,a);
22             we=1;
23             for(int j=0;j<a.size();j++){
24                 we=(we*b+(long long)a[j])%23333;
25             }//同上 
26             q=0;
27             for(int j=0;j<(int)v[we].size();j++){
28                 if(v[we][j]==a){//判斷字元串是不是相等 
29                     cout<<"yes"<<endl;
30                     q=1;
31                     break;//這裡可是坑壞了,如果不寫break它會打出很多"yes",要不然就在上面查重 
32                 }
33             }
34             if(q==0){//變數控制 
35                 cout<<"no"<<endl;
36             }
37         }
38     }
39 }

完美結束

Tags: