ICPC上海J.Two Binary Strings Problem(bitset&位运算)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ICPC上海J.Two Binary Strings Problem(bitset&位运算)相关的知识,希望对你有一定的参考价值。

ICPC上海J.Two Binary Strings Problem(bitset&位运算)

显然对于 k k k,只需考虑 s i s_i si s i − k s_i-k sik的关系 ( i ≥ k ) (i\\ge k) (ik)

所以不妨将 A A A 0 0 0变为 − 1 -1 1,预处理前缀和。

然后将前缀和的 i n d e x index index从大到小排序。

然后用 b i t s e t bitset bitset A A A维护当前 i n d e x − 0 , i n d e x − 1 , i n d e x − 2 index-0,index-1,index-2 index0,index1,index2 是否在之前出现过。

根据 b [ i n d e x ] b[index] b[index] 讨论,若为1,可以把所有之前出现过的 i n d e x ( j ) index(j) index(j) 标记为无解,因为满足了 s j ≥ s i n d e x , j < i n d e x s_j\\ge s_index ,j<index sjsindex,j<index

否则,可以把所有之前未出现过的 i n d e x index index标记为无解,这里对维护的 b i t s e t bitset bitset取个反即可, s j < s i n d e x , j < i n d e x s_j<s_index,j<index sj<sindex,j<index

此外还需维护一个 l a s t last last,因为题意要求对于 k k k [ 1 , k ] [1,k] [1,k]的前缀也要满足情况。

所以找到最小的 l a s t last last,当 i ≥ l a s t i\\ge last ilast 全为无解。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=5e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

char a[N],b[N];
int s[N];
int id[N];
bool cmp(int a,int b)
	return s[a]==s[b]?a<b:s[a]>s[b];

bitset<N>A,B,C;
int main()
	int t;scanf("%d",&t);while(t--)
		int n;scanf("%d",&n);
		scanf("%s%s",a+1,b+1);
		A.reset(),B.reset(),C.reset();id[0]=0;
		rep(i,1,n) s[i]=s[i-1]+(a[i]=='1'?1:-1),id[i]=i,B[i]=1;
		sort(id+0,id+n+1,cmp);
		int last = n+1;
		rep(i,0,n)
			int p = id[i];
			if(!p)
				A[n-p]=1;continue;
			
			if(b[p]=='1')
				C|=A>>(n-p);
			else C|=(A^B)>>(n-p);
			if( (b[p]=='1'&&s[p]<=0) || (b[p]=='0'&&s[p]>0) ) last=min(last,p);
			A[n-p]=1;
		
		rep(i,1,n)
			if(C[i]||i>=last) putchar('0');
			else putchar('1');
		putchar('\\n');
	
	return 0;


以上是关于ICPC上海J.Two Binary Strings Problem(bitset&位运算)的主要内容,如果未能解决你的问题,请参考以下文章

2015 百度之星初赛 1 2 2015ACM/ICPC亚洲区上海站 codeforces 851

2020 ICPC 上海(部分题解)

2019.09.152019icpc上海网络赛

2015 ICPC 上海

icpc上海站打铁记

B. Light bulbs(2019 ICPC上海站)