P1816统计数字
好吧,快NOIP考试了,我临时抱佛脚,随便刷题了233。
今天这是一道简单(标准)(水)的哈希
#include<stdio.h>
#include<stdlib.h>
typedef struct nature{
int a;
int sum;
struct nature* next;
}N;//每一个单独元素建立一个结构
N hash[13];//每个元素hash存储
int S[10005];
int SUM=-1;
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int add(int t)//添加新元素
{
N* p;
N* p1;
p=&hash[t%13];
while(1)
{
if(t==p->a)
{
p->sum++;
return 0;
}
else
{
if(p->next!=0)
p=p->next;
else
break;
}
}
if(p->next==0)
{
p1=(N*)malloc(sizeof(N));
p1->a=t;
p1->sum=1;
p1->next=0;
p->next=p1;
}
return 0;
}
int search(int a)//取出所有的非重复元素
{
N* p;
p=hash[a].next;
while(p!=0)
{
SUM++;
S[SUM]=p->a;
p=p->next;
}
return 0;
}
int read(int t)//读出
{
N* p;
p=hash[t%13].next;
while(p->a!=t)
p=p->next;
printf("%d %d \n",t,p->sum);
return 0;
}
int main()
{
int n;
int i,temp;
scanf("%d",&n);
for(i=0;i<13;i++)
{
hash[i].next=0;
hash[i].a=-1;
hash[i].sum=-1;
}
for(i=1;i<=n;i++)
{
scanf("%d",&temp);
add(temp);
}
for(i=0;i<13;i++)
search(i);
qsort(S,SUM+1,sizeof(int),comp);//及其智障的“+1”,最后一位的下标为SUM,总长度为SUM+1
for(i=0;i<=SUM;i++)
read(S[i]);
return 0;
}
啦啦,很简单,因为有最多10000个数字,最大是1.5*10^9,不好每个比较,就用哈希分类·。再通过线性表处理矛盾空间大小为O(N),时间复杂度(N^2)(即所有元素对13求余值相同,然后全部排一起。。。)