zoukankan      html  css  js  c++  java
  • 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;
    }                 
  • 相关阅读:
    HDU 2594 扩展kmp模板题
    HDU 1358 简单kmp
    HDU 3336 扩展kmp
    SPOJ SUBLEX 求第k小子串
    Codeforces 235C
    HDU 4622 Reincarnation
    HDU 4622 求解区间字符串中的不同子串的个数
    [LeetCode] Length of Last Word 字符串查找
    [LeetCode] Sudoku Solver 解数独,递归,回溯
    [LeetCode] Longest Common Prefix 字符串公有前序
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2684071.html
Copyright © 2011-2022 走看看