题目:
有很多货物,有n个操作(0<= n <= 1e6)
加数操作:将输入的编号为x的货物标记
查询操作:查询输入的编号为x的货物是否被标记
思路:
这个题目还是比较简单的,但是想尝试一下哈希算法,手写哈希最重要的还是要处理好冲突问题。
代码:
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define FRE() freopen("in.txt", "r", stdin) #define FRO() freopen("out.txt", "w", stdout) using namespace std; typedef long long ll; const int maxn = 1e6+10; const int MOD = 1e6+7; int mp[maxn]; void addNum(int x) { int t = x; x = x%MOD; while(true) { if(!mp[x]) { mp[x] = t; return; } if(mp[x] != t)//处理冲突 x = (x+1)%maxn; else return; } } bool query(int x) { int t = x; x = x%MOD; while(true) { if(!mp[x]) return false; if(mp[x]!=t) x = (x+1)%maxn; else return true; } } int main() { int n; scanf("%d",&n); while(n--) { int o,x,idx; scanf("%d%d",&o,&x); if(o==0) { addNum(x+1); } else { if(query(x+1)) printf("yes\n"); else printf("no\n"); } } return 0; }
原文:https://www.cnblogs.com/sykline/p/10959254.html