牛客tokitsukaze and Hash Table题解

tokitsukaze and Hash Table

题意

就是实现 x%n 存储的哈希表。


链接:https://ac.nowcoder.com/acm/contest/1080/B
来源:牛客网


tokitsukaze有n个数,需要按顺序把他们插入哈希表中,哈希表的位置为0到n-1。
插入的规则是:
刚开始哈希表是空的。
对于一个数x,在哈希表中,如果(x mod n)的位置是空的,就把x放在(x mod n)的位置上。如果不是空的,就从(x mod n)往右开始找到第一个空的位置插入。若一直到n-1都不是空的,就从位置0开始继续往右找第一个空的位置插入。
因为哈希表总共有n个空位,需要插入n个数,所以每个数都能被插入。
现在tokitsukaze想知道把这n个数按顺序插入哈希表后,哈希表中的每个位置分别对应的是哪个数。

输入

第一行包含一个正整数n(1≤n≤10^6)。
第二行包含n个非负整数x(0≤x≤10^9),这些数按从左到右的顺序依次插入哈希表。

输出

输出一行,n个数,第i个数表示哈希表中位置为i所对应的数。(0≤i≤n-1)

思路

  记得上数据结构与算法课的时候讲过这种hash表,但是当时只是简单的想直接暴力就能做O(n^2),没有仔细想还有什么更快的方法。
  这题数据范围暴力肯定炸,可以用并查集做,填上当前位置,指向下一个空位为根结点,这样就能直接找到下一个空位。O( α \alpha n)

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000005
#define ll long long

int ff[MAXN];
int find(int x)
{
    return ff[x]==x?x:ff[x]=find(ff[x]);
}

void read(int &x)
{
    x=0;
    bool flag=0;
    char ch=getchar();
    if(ch=='-') flag=1;
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x*=10,x+=ch-'0',ch=getchar();
    if(flag) x=-x;
}

int ans[MAXN];
int main()
{
    int n;
    read(n);
    for(int i=1;i<=n;i++)
        ff[i]=i;

    for(int i=1;i<=n;i++)
    {
        int x;
        read(x);
        int nx=find(x%n);
        ans[nx]=x;
        int nex=find(nx+1);
        if(nex==n)
            nex=0;
        ff[nx]=nex;
    }

    for(int i=0;i<n;i++)
    {
        printf("%d",ans[i]);
        if(i!=n-1)printf(" ");
    }
    return 0;
}
发布了41 篇原创文章 · 获赞 2 · 访问量 1262

猜你喜欢

转载自blog.csdn.net/qq_41418281/article/details/100045759