#10034.「一本通 2.1 例 2」图书管理-哈希(双哈希思想)+邻接表

Posted ofshk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#10034.「一本通 2.1 例 2」图书管理-哈希(双哈希思想)+邻接表相关的知识,希望对你有一定的参考价值。

技术图片

 技术图片

 

 

样例

样例输入

4
add Inside C#
find Effective Java
add Effective Java
find Effective Java

样例输出

no
yes

数据范围与提示

n<=30000

 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 using namespace std;
 6 typedef long long ll;
 7 const int mod1=1e6+3,mod2=1e6+9,p1=47,p2=79,N=30020;
 8 int k,to[N],endd[N];
 9 int first[mod1+20];//注意poi数组开的大小范围,不是N
10 char a[10],b[220];
11 
12 void add(int x,int y)//邻接表实现该操作
13 {
14     to[k]=first[x];
15     first[x]=k;
16     endd[k]=y;
17     k++;
18 }
19 
20 int query(int x,int y)
21 {
22     for(int i=first[x]; i!=-1; i=to[i])
23     {
24         if(endd[i]==y)
25             return 1;//该字符串找到了
26     }
27     return 0;
28 }
29 
30 int main()
31 {
32     int t;
33     scanf("%d",&t);
34     memset(to,-1,sizeof(to));//最好用-1进行清空,因为有时侯点会从0开始,会导致多存
35     k=1;//k最好是从1开始存,否则容易出错
36     while(t--)
37     {
38             scanf("%s",a);
39         gets(b);
40         int lb=strlen(b);
41         int sum1=0,sum2=0;
42         for(int i=0; i<lb; i++) //计算出每个书名的哈希值
43         {
44             //双哈希思想,减小误差
45             sum1=(sum1*p1+b[i])%mod1;
46             sum2=(sum2*p2+b[i])%mod2;
47         }
48         if(strcmp(a,"add")==0)//add操作,该操作单向即可,不需要add(sum2,sum1)
49             add(sum1,sum2);
50         else //寻找是否出现过该书
51         {
52             int w=query(sum1,sum2);
53             if(w)
54                 printf("yes
");
55             else
56                 printf("no
");
57         }
58     }
59     return 0;
60 }

 

 

以上是关于#10034.「一本通 2.1 例 2」图书管理-哈希(双哈希思想)+邻接表的主要内容,如果未能解决你的问题,请参考以下文章

一本通1586 例 2数字游戏

一本通1593例 2牧场的安排

10249「一本通 1.3 例 5」weight

一本通1553例 2暗的连锁

题解一本通1553:例 2暗的连锁

loj10043. 「一本通 2.2 例 1」剪花布条