SUBSET

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
",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;
}
原文地址:https://www.cnblogs.com/JebediahKerman/p/6011326.html