#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\n");
55 else
56 printf("no\n");
57 }
58 }
59 return 0;
60 }
分类:
数论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」