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 si−k的关系 ( i ≥ k ) (i\\ge k) (i≥k)
所以不妨将 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 index−0,index−1,index−2 是否在之前出现过。
根据 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 sj≥sindex,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 i≥last 全为无解。
#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&位运算)的主要内容,如果未能解决你的问题,请参考以下文章