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(
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;
}