哈希表
哈希表
例题:
不重复数字
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+15;
const int P=100003;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return f*x;
}
struct HASH{
int nxt[N],hd[P+100],val[N],tot,to[N];
inline void ins(int v) {
int x=(v%P+P)%P;
for(int i=hd[x];i;i=nxt[i]) {
if(to[i]==v) {
++val[i];return;
}
}
to[++tot]=v;val[tot]=1;nxt[tot]=hd[x];hd[x]=tot;
}
inline int query(int v) {
int x=(v%P+P)%P;
for(int i=hd[x];i;i=nxt[i])
if(to[i]==v) return val[i];
return 0;
}
inline void clear() {
// for(int i=0;i<=tot;i++) hd[i]=0;
memset(hd,0,sizeof(hd));
tot=0;
}
}H;
int n,a[N];
int main() {
int T=read();
while(T--) {
H.clear();
n=read();
for(int i=1;i<=n;i++) {
a[i]=read();
if(H.query(a[i])) continue;
H.ins(a[i]);
printf("%d ",a[i]);
}
puts("");
}
return 0;
}
CF776C Molly's Chemicals
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const ll inf=1e15;
const int P = 100003;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return f*x;
}
int n,k;
ll a[N],mi[65];
struct HashTable {
int nxt[N],val[N],hd[N],tot;
ll to[N];//hash
inline void ins(ll v) {
int x=v%P;
if(x<0) x+=P;
for(int i=hd[x];i;i=nxt[i]) {
ll y=to[i];
if(y==v) {++val[i];return;}
}
to[++tot]=v;val[tot]=1;nxt[tot]=hd[x];hd[x]=tot;
}
inline int query(ll v) {
int x=v%P;
if(x<0) x+=P;
for(int i=hd[x];i;i=nxt[i]) {
ll y=to[i];
if(y==v) return val[i];
}
return 0;
}
inline void clear() {
memset(hd,0,sizeof(hd));
tot=0;
}
}H;
int main() {
H.clear();
n=read();k=read();
int len=0;
if(k==1) {
mi[0]=1;len=1;
} else if(k==-1) {
mi[0]=1;mi[1]=-1;
len=2;
} else {
ll x=1;
while(-inf<=x&&x<=inf)
mi[len++]=x,x*=k;
}
H.ins(0);
ll ans=0,sum=0;
for(int i=1;i<=n;i++) {
int x=read();sum+=x;
for(int j=0;j<len;j++)
ans+=H.query(sum-mi[j]);
H.ins(sum);
}
printf("%lld\n",ans);
return 0;
}
11.10 模拟赛t1
2e9以内的斐波那契数只有41个,我们开个 哈希表,每次枚举这41个数查hash表里有没有\(f[j]-a[i]\) ,有的话就清空表,答案加一
#include <bitset>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+10;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return f*x;
}
void write(int x) {
static short st[32];short tp=0;
do st[++tp]=x%10,x/=10;while(x);
while(tp) putchar('0'|st[tp--]);
putchar('\n');
}
int n,f[50],a[N];
const int P=133331;
struct node{
int to[P+5],nxt[P+5],hd[P+5],val[P+5],tot;
inline void ins(int x) {
int v=(x%P+P)%P;
for(int i=hd[v];i;i=nxt[i]) {
if(to[i]==x) {
++val[i];
return;
}
}
to[++tot]=x;val[tot]=1;nxt[tot]=hd[v];hd[v]=tot;
}
inline int query(int x) {
int v=(x%P+P)%P;
for(int i=hd[v];i;i=nxt[i])
if(to[i]==x)
return val[i];
return 0;
}
inline void clear() {
memset(hd,0,sizeof(hd));
tot=0;
}
}Hash;
int main() {
// freopen("f1.in","r",stdin);
// freopen("my.out","w",stdout);
n=read();
for(int i=1;i<=n;i++) a[i]=read();
f[1]=1;f[2]=2;
for(int i=3;i<=41;i++)
f[i]=f[i-1]+f[i-2];
int ans=1;
Hash.ins(a[1]);
for(int i=2;i<=n;i++) {
for(int j=1;j<=41;j++) {
if(Hash.query(f[j]-a[i])) {
Hash.clear();
ans++;
break;
}
}
Hash.ins(a[i]);
}
write(ans);
return 0;
}