题目:
小易有一个初始为空的数字集合,支持两种操作:
1、加入数字x到集合中。
2、询问集合中是否存在一个子集,满足子集中所有数字的Or值恰好为k。
Or为二进制按位或操作,C++中表示为"|"。
小易希望你能解决这个问题。
思路:
使用 HashSet 记录值,防止重复(使用 add 方法添加)
在目标子集中的数字的二进制模式下,1的位数必定是小于等于目标值的。
所以,遍历集合,找到和目标值 与操作下仍是原值的数字,将它按位或到暂存值。
只要遍历到暂存值等于目标值,就说明存在该子集。(还有遍历值直接等于目标值的特殊情况)。
此时输出 Yes
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int q = sc.nextInt();
Set<Integer> set = new HashSet<>();
while(q-->0){
int flag =sc.nextInt(),target=sc.nextInt();
if(flag==1){set.add(target);}
else{
int temp=0;
for(Integer each:set){
if((each&target)==each){
temp|=each;
}
if(each==target){temp=target;break;}
if(target==temp)break;
}
if(temp==target){
System.out.println("YES");
set.add(target);
}
else System.out.println("NO");
}
}
}
}