1.插入x
2.删除x
3.给s,查询(a&s==a)的个数
插入和删除其实是相同的。
插入删除的时候前八位枚举子集,操作一下就行了。
查询的时候枚举后八位,然后就高维前缀和一下输出即可。
#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
void cmax(int&x,const int&y){x=x>y?x:y;}
void cmin(int&x,const int&y){x=x<y?x:y;}
const int N=256;
struct Node{
int cnt[N],f[N];
int&operator[](int x){return cnt[x];}
void dp(){
rep(i,0,N-1)f[i]=cnt[i];
rep(j,0,7)rep(i,0,N-1)if(i>>j&1)f[i]+=f[i^(1<<j)];
}
}a[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int q;
cin>>q;
while(q--){
string s;
cin>>s;
if(s=="add"){
int x;
cin>>x;
int y=x>>8,z=x&255;
int u=y^255;
for(int sub=u;;--sub&=u){
a[y^sub][z]++;
if(!sub)break;
}
}
if(s=="del"){
int x;
cin>>x;
int y=x>>8,z=x&255;
int u=y^255;
for(int sub=u;;--sub&=u){
a[y^sub][z]--;
if(!sub)break;
}
}
if(s=="cnt"){
int x;
cin>>x;
int y=x>>8,z=x&255;
a[y].dp();
cout<<a[y].f[z]<<'
';
}
}
return 0;
}