南阳oj 寻找球号(二) 数据结构 题目138

来源:互联网 发布:淘宝电动车便宜 编辑:程序博客网 时间:2024/06/05 06:52


刚开始我用普通的做了不下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"); 
 } 
 } 
 }
}

0 0
原创粉丝点击