NYOJ 138

 

找球号(二)

时间限制: 1000 ms | 内存限制: 65535 KB
难度: 5
 
描述
在某一国度里流行着一种游戏。游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,还有一个空箱子,现在有两种动作:一种是"ADD",表示向空箱子里放m(0<m<=100)个球,另一种是"QUERY”,表示说出M(0<M<=100)个随机整数ki(0<=ki<=100000100),分别判断编号为ki 的球是否在这个空箱子中(存在为"YES",否则为"NO"),先答出者为胜。现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利。
 
输入
第一行有一个整数n(0<n<=10000);
随后有n行;
每行可能出现如下的任意一种形式:
第一种:
一个字符串"ADD",接着是一个整数m,随后有m个i;
第二种:
一个字符串"QUERY”,接着是一个整数M,随后有M个ki;

输出
输出每次询问的结果"YES"或"NO".
样例输入
2

ADD 5 34 343 54 6 2

QUERY 4 34 54 33 66
样例输出
YES

YES

NO

NO


 1  

 2 #include<cstdio>

 3 #include<bitset>

 4 #include<cstring>

 5 using namespace std;

 6 

 7 bitset <100000001> Q;

 8 int main()

 9 {

10     char ch[11];

11     int T,m,a,i,j;

12     scanf("%d",&T);

13     while(T--)

14     {

15           //Q.reset();//全部置为0,加上这一句就TLE,不加就AC 

16         scanf("%s%d",ch,&m);

17         if(ch[0]=='A')

18             for(j=0;j<m;j++)

19             {

20                 scanf("%d",&a);

21                 Q[a]=1;

22             }

23        else for(j=0;j<m;j++)

24            {

25                scanf("%d",&a);

26                if(Q[a]==1) printf("YES\n");

27                else printf("NO\n");

28         }

29     }

30 }        
//用hash一定要开大空间,否则可能TLE

//用bitset亦可

//set,使用test方法判断是否存在

/*

set.find(value) == set.end()

就是查找value是否在set里面

如果没找到,就会返回一个指向end()的iterator

*/

 

#include <iostream>

#include <stdio.h>

#include <string>

#include <string.h>

using namespace std;



const int N = 9533333;

const int  ope  =  N;

int ch[N];

//先对素数求余, 不求余,就把数组开大,不然value超过N怎么办



int hashfun(int val)

{

    return val%(ope);

}



void insert(int num)

{

    int pos=hashfun(num);

    while(ch[pos]>0)

        pos=(pos+1)%N;

    ch[pos]=num;

}



bool find(int num)

{

    int pos=hashfun(num);

    int i=0;

    while(ch[pos]&&ch[pos]!=num&&i<N)

        pos=(pos+1)%N;

    if(ch[pos]&&i<N)return 1;

    return 0;

}



int main()

{

    memset(ch,0,sizeof(ch));

    int i,j,k,T;

    scanf("%d",&T);

    int cnt,num;

    string s;

    while(T--)

     {

          s.clear();

        cin>>s;

        scanf("%d",&cnt);

        if(s=="ADD")

          {

            while(cnt--)

               {

                scanf("%d",&num);

                insert(num);

            }

        }

        if(s=="QUERY")

          {

            while(cnt--)

               {

                scanf("%d",&num);

                if(find(num))

                      puts("YES");

                else 

                      puts("NO");

            }

        

        }

    }

    return 0;

}                 

 

你可能感兴趣的:(OJ)