bitset 相关板子
二分图匹配 dfs 版: https://uoj.ac/submission/619931
#define N 505
int n,m;
int bel[N];
bitset<N>e[N],nvis;
bool match(int u){
for(int i=(e[u]&nvis)._Find_first();i!=N;i=(e[u]&nvis)._Find_next(i))
if(!bel[i]||(nvis.reset(i),match(bel[i]))) return bel[i]=u,1;
return 0;
}
二分图匹配 bfs 版: https://uoj.ac/submission/619932
#define N 505
bitset<N>e[N],nvis;
int bel[maxn];
int q[maxn],hd,tl,prex[maxn],prey[maxn];
int bfs(int s){
q[hd=tl=1]=s,nvis.set();
int p=0;
while(hd<=tl){
int u=q[hd++];
bitset<N>now=e[u]&nvis;
for(int v=now._Find_first();v!=N;v=now._Find_next(v)){
nvis.reset(v);
int x=bel[v];
if(x)q[++tl]=x,prex[x]=u,prey[x]=v;
else bel[v]=p=u;
if(p)break;
}
if(p)break;
}
if(!p)return 0;
for(int i=p;i!=s;i=prex[i]) bel[prey[i]]=prex[i];
return 1;
}
bitset 做 01 数组高维前缀和 \(O(n\times 2^n/64)\) (真的有用吗?)
// mxs = (1<<(n-6))
int mxs;
ull num[7];
ull bs[1<<22|5];
void init(){
For(i,0,5)For(j,0,63)
if(!((j>>i)&1))num[i]|=(1ull<<j);
}
void OR(int x){
if(x<6){
For(i,0,mxs-1) bs[i]|=(bs[i]&num[x])<<(1<<x);
}else{
int len=(1<<(x-6));
for(int i=0;i<mxs;i+=len<<1)
for(int j=0;j<len;++j)
bs[i|j|len]|=bs[i|j];
}
}
void AND(int x){
if(x<6){
For(i,0,mxs-1) bs[i]|=(bs[i]&(63^num[x]))>>(1<<x);
}else{
int len=(1<<(x-6));
for(int i=0;i<mxs;i+=len<<1)
for(int j=0;j<len;++j)
bs[i|j]|=bs[i|j|len];
}
}
bitset lcs query \(O(n^2/63)\)
#define N 3005
struct bitlcs{
int n,m,s[N],t[N];
ull p[N][N/63+1],f[N][N/63+1];
int sum[N][N/63+1];
void clr(){n=m=0;}
void add1(int x){s[n++]=x;}
void add2(int x){t[m++]=x;}
void wk(){
For(i,0,m-1)p[t[i]][i/63]|=(1ull<<(i%63));
For(i,0,n-1){
int c=1;
For(j,0,(m-1)/63){
ull x=f[i-1][j],y=f[i-1][j]|p[s[i]][j];
x+=x+c+((~y)&((1ull<<63)-1));
f[i][j]=x&y,c=x>>63;
sum[i][j]=__builtin_popcountll(f[i][j]);
if(j)sum[i][j]+=sum[i][j-1];
}
}
For(i,0,m-1)p[t[i]][i/63]=0;
}
int ask(int x,int y){
if(x<0||y<0||x>=n||y>=m)return 0;
int res=__builtin_popcountll(f[x][y/63]&((1ull<<(y%63+1))-1));
if(y/63)res+=sum[x][y/63-1];
return res;
}
};