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;
	}
};
posted @ 2023-04-28 00:13  Rainbow_qwq  阅读(104)  评论(0编辑  收藏  举报