NOJ --138 找球号(二)

     最基础的哈希表用法,先看所要存的个数,一般都是10N+10的内存,这样相当于十个位置里面有一个,空间是足够的。之前一直一直都是超时,就是因为内存开小的话就会出现死循环,因为存不了那么多个数

 

 
#include<stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int base =10000010;
int h[base];
void hash(int k)
{
    int m=k%base;
    if(m<0) m+=base;
    while(m++,1)
    {
        if(m>=base)  m=m%base;
        if(h[m]==-1)
          {
              h[m]=k;
              break;
          }
        if(h[m]==k)
           break;  //当出现一样的数时,只需存一次
    }
}
bool find_haxi(int k)
{
    int m=k%base;
    if(m<0) m+=base;
    bool flage=false;
    while(m++,1)
    {
        if(m>=base) m=m%base;
        if(h[m]==-1)
        {
            break;
        }
       if(h[m]==k)
       {
           flage=true;
           break; //找到了;
       }
    }
    return flage;
}
int main()
{
    int n, m, ok;
    char s[1000];
    scanf("%d", &n);
    memset(h, -1,sizeof(h));
    while(n--)
    {
        scanf("%S%d", s, &m);
        if(s[0]=='A')
        {
            while(m--)
            {
                scanf("%d",&ok);
                hash(ok);
            }
            continue;
        }
        while(m--)
        {
            scanf("%d", &ok);
             if(find_haxi(ok))
            {
                puts("YES");
                continue;
            }
            puts("NO");
        }

    }
    return 0;
}
        


哈希表的模板

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int base = 1000000;
int h[base+10];
bool flage;
void Init()
{
    //hash数组初始化全为-1
    //如存在-1需特判
    memset(h,-1,sizeof(h));
}
void Hash(int k)
{
    int m = k % base;
    if(m < 0) m += base;
    while(m++,1)
    {
        if(m >= base) m %= base;
        if(h[m] == -1)
        {
            h[m] = k;
            break;
        }
        if(h[m] == k)
            break;
    }
}
bool Find_Hash(int k)
{
    int m = k % base;
    if(m < 0) m += base;
    bool loop = false;
    while(m++,1)
    {
        if(m >= base) m %= base;
        if(h[m] == -1)
            break;
        if(h[m] == k)
        {
            loop = true;
            break;
        }
    }
    return loop;
}


 还有一种就是不需要开那么大内存,就是用vector来写,因为是数组所以不需要开那么大的内存。直接在找的那组余数里面找看是否有存在这个数。

#include <vector>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
const int base =10000;
vector<int> m[base];
void find(int x)
{
    int b=x%base;
     m[b].push_back(x);
}
void hash(int x)
{
    int c,flage=0;
    int b=x%base;
    c=m[b].size();
    for(int i =0 ;i<c; i++)
    {
        if(m[b][i]==x)
        {
            puts("YES");
            flage=1;
            break;
        }
    }
    if(!flage)
     puts("NO");
}
int main()
{
    int n,m;
    scanf("%d", &n);
    while(n--)
    {
      char s[100];
      int m, i;
      scanf("%s%d", s, &m);
      if(s[0]=='A')
          while(m--)
          {
            scanf("%d", &i);
            find(i);
          }
      else
          while(m--)
          {
              scanf("%d",&i);
              hash(i);
          }
    }

    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值