给大家推荐个靠谱的公众号程序员探索之路,大家一起加油
刚开始我用普通的做了不下30遍 老师Runtime Error
//普通顺序表超时了
#include<stdio.h>
#include<string.h>
const int N=100000;
struct node
{
int length;
int num[N];
};
typedef struct node linklist;
void chu(linklist *head)
{head->length=0;}
void in(linklist *head,int l)
{
head->num[head->length]=l;
head->length++;
}
bool sert(linklist *head,int n)
{
for(int i=0;i<head->length;i++)
{
if(head->num[i]==n) return true;
}
return false;
}
main()
{
linklist head;
chu(&head);
int n,k,m,h;
char s[5];
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
scanf("%d",&k);
if(strcmp(s,"ADD")==0)
{
for(int j=0;j<k;j++)
scanf("%d",&h);
in(&head,h);}
else
{
for(int j=0;j<k;j++)
{
scanf("%d",&m);
if(sert(&head,m)) printf("YES\n");
else printf("NO\n");
}
}
}
}
//Hans表做的
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn=1000002;
const int fib=111123;//这个值是看别人的目前我也不了解
int Hash[maxn],head[maxn],next[maxn];//head相当于每一个散列表的头节点,当前节点的下一个节点
int top;
void add(int m)//插入元素
{
int key=m%fib;
next[top]=head[key];
head[key]=top;
Hash[top]=m;
top++;
}
bool query(int m)//查询是否与m相同的元素
{
int key=m%fib;
for(int i=head[key];i>-1;i=next[i])
{
if(Hash[i]==m)
return true;
}
return false;
}
main()
{
int n,m,num;
char s[5];
scanf("%d",&n);
memset(head,-1,sizeof(head));//赋初值
top=0;
while(n--)
{
scanf("%s %d",s,&m);
if(s[0]=='A')
{
for(int i=0;i<m;i++)
{
scanf("%d",&num);
add(num);
}
}
else
{
for(int i=0;i<m;i++)
{
scanf("%d",&num);
if(query(num)) printf("YES\n");
else printf("NO\n");
}
}
}
}