• 【模板】Hash拉链法


    Hash的挑战

    (hash.cpp/c/pas)

    Time Limit:1Sec  Memory Limit:128 MB

    问题背景

    土匪帮主写作业的时候遇到了一道搜索题,用map结果TLE了3个点。经过无数次调 试,才发现map的时间复杂度原来是n*log2(n),为此土匪就来学习HASH。但合适的教程,于是向您请教,如果你愿意,就先来接受土匪的挑战,证明下你的HASH是正确的吧!

    问题描述

    具体测试内容如下:由土匪给定一串长度为n的数组,在规定的时间内回答m组问题,每个问题都很简单,你需要回答每一个给的数字是否出现在给定的数组内。如果这个数字存在,请输出Yes;否则输出No

    Intput

    第一行有一个正整数n,表示待查询数组的元素个数。 接下来第i+1行表示第i个元素的值。第n+2行一个正整数m,表示待查询的元素个数。再接下来第n+2+i行表示第i个待查询元素的值。

    Output

    输出共m行,每一行输出Yes或者No。

    Data Limitation

    30%的数据满足:1<=m,n,A[i],B[i]<=10000
    60%
    的数据满足:A[i],B[i]<=1000000000,1<=m,n<=1000000
    100%
    的数据满足:1<=m,n,A[i],B[i]<=20000000

     

     

     


    【题解】

    #include<cstdio>
    inline int read(){char ch=getchar(),w=1;int x=0;while(ch<'0'||ch>'9'){if(ch=='-')w=-1;
    ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return w*x;}
    inline void wr(int x){if(x<0)putchar('-'),x=-x;if(x>9)wr(x/10);putchar(x%10+'0');}
    inline void wrln(int x){wr(x);putchar('
    ');}
    const int mod=100003;
    struct Node{
    	int key;
    	Node* nxt;
    	Node(){
    		key=0;
    		nxt=NULL;
    	}
    };
    Node H[mod+1000];
    int hash(int val){
    	return val%mod;
    }
    bool search(int v){
    	int id=hash(v);
    	Node *p=H[id].nxt;
    	for(;p;p=p->nxt)if(p->key==v)return true;
    	return false;
    }
    void Insert(int v){
    	if(search(v))return;
    	int id=hash(v);
    	Node *p=new Node();
    	p->key=v;
    	p->nxt=H[id].nxt;
    	H[id].nxt=p;
    	return;
    }
    char ans[2][12]={{'N','o',''},{'Y','e','s',''}};
    int main(){
    	freopen("hash.in","r",stdin);
    	freopen("hash.out","w",stdout);
    	int n,m,a;
    	n=read();
    	for(int i=1;i<=n;i++){
    		a=read();
    		Insert(a);
    	}
    	m=read();
    	for(int i=1;i<=m;i++){
    		a=read();
    		puts(ans[search(a)]);
    	}
    	return 0;
    }





  • 相关阅读:
    HDU 3501 Calculation 2 ——Dirichlet积
    BZOJ 1101 [POI2007]Zap ——Dirichlet积
    BZOJ 1257 [CQOI2007]余数之和sum ——Dirichlet积
    SGU 194 Reactor Cooling ——网络流
    BZOJ 1497 [NOI2006]最大获利 ——网络流
    BZOJ 2705 [SDOI2012]Longge的问题 ——Dirichlet积
    BZOJ 1653 [Usaco2006 Feb]Backward Digit Sums ——搜索
    BZOJ 1861 [Zjoi2006]Book 书架 ——Splay
    BZOJ 3130 [Sdoi2013]费用流 ——网络流
    BZOJ 3990 [SDOI2015]排序 ——搜索
  • 原文地址:https://www.cnblogs.com/kcfzyhq/p/8475589.html
Copyright © 2020-2023  润新知