问题 G: 找明星
时间限制: 1 Sec 内存限制: 64 MB[ 提交][ 状态][ 讨论版]
题目描述
你喜欢你的偶像吗?那你能在茫茫人海中认出他来吗?现在有一群人,每个人都有一个整数编号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;
随后有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#include<stdio.h> #include<string.h> #include<math.h> const int N = 1000002; #define MAX 200003; int Head[N]; int Next[N]; int Hash[N]; void add(int &top, int num) { int key = num%MAX; Next[top] = Head[key]; Head[key] = top; Hash[top] = num; ++top; } bool search(int num) { int key = num%MAX; for(int i = Head[key]; i > -1; i = Next[i]) { if(Hash[i] == num) { return true; } } return false; } int main() { int n, m, x; int top = 0; char str[10]; scanf("%d", &n); memset(Head, -1, sizeof(Head)); while(n--) { scanf("%s %d", str, &m); if(str[0] == 'A') { for(int i = 0; i < m; i++) { scanf("%d", &x); add(top, x); } } else if(str[0] == 'Q') { for(int i = 0; i < m; i++) { scanf("%d", &x); if(search(x)) printf("YES\n"); else printf("NO\n"); } } } return 0; }