DESCRIPTION:
一开始你有一个空集,集合可以出现重复元素,然后有Q 个操作
1. add s
在集合中加入数字s。
2. del s
在集合中删除数字s。保证s 存在
3. cnt s
查询满足a&s = a 条件的a 的个数
INPUT:
第一行一个整数Q 接下来Q 行,每一行都是3 个操作中的一个
OUTPUT:
对于每个cnt 操作输出答案
SAMPLE INPUT:
7
add 11
cnt 15
add 4
add 0
cnt 6
del 4
cnt 15
SAMPLE OUTPUT:
1
2
2
数据范围:
30%:1<=n<=1000
100%:1<=n<=200000, 0<=s<=2^16
#include<cstdio> using namespace std; int main() { freopen("subset.in","r",stdin); freopen("subset.out","w",stdout); int q(0),s(0),suffix(0),preffix(0),cnt(0); static int ms[256][256]; char buf[5]; scanf("%d",&q); while(q) { q--; scanf("%s%d",buf,&s); switch(buf[0]) { case‘a‘: preffix=s>>8; s=s&255; for(suffix=s;suffix<=255;suffix++) if((s&suffix)==s) ms[preffix][suffix]++; break; case‘c‘: suffix=s&255; s=s>>8; cnt=0; for(preffix=s;preffix>=0;preffix--) if((preffix&s)==preffix) cnt+=ms[preffix][suffix]; printf("%d\n",cnt); break; case‘d‘: preffix=s>>8; s=s&255; for(suffix=s;suffix<=255;suffix++) if((s&suffix)==s) ms[preffix][suffix]--; break; } } return 0; }
时间: 2024-10-29 19:09:48