acm-(异或、思维)Codeforces Round #705 (Div. 2) E. Enormous XOR

24 篇文章 0 订阅
10 篇文章 0 订阅

题面
传送门

首先给出结论:

  1. l 0 = 0 , r 0 = 1 l_0=0,r_0=1 l0=0,r0=1,那么答案就是 111...1 111...1 111...1(长度为 n n n)。
  2. 否则若 r r r为奇数或 l + 1 ≥ r l+1\ge r l+1r,那么答案是 r r r
  3. 否则( r r r为偶数并且 l + 1 < r l+1<r l+1<r)答案是 r + 1 r+1 r+1

下面给出证明:
第一种情况下我们可以找到长度为 n n n 01111..1 01111..1 01111..1 1000..0 1000..0 1000..0串,两者异或就能得到长度为 n n n 1111..1 1111..1 1111..1

第二种情况我们先考虑 l + 1 ≥ r l+1\ge r l+1r的情况,此时无非有两种 c a s e case case,若 l = r l=r l=r,显然答案是 r r r,否则的话 l + 1 = r l+1=r l+1=r,我们发现 g ( l , l ) , g ( l , l + 1 ) , g ( l + 1 , l + 1 ) g(l,l),g(l,l+1),g(l+1,l+1) g(l,l),g(l,l+1),g(l+1,l+1) g ( l + 1 , l + 1 ) g(l+1,l+1) g(l+1,l+1)取得 f ( l , r ) f(l,r) f(l,r)的最大值即 r r r
现在考虑稍微复杂点的 r r r为奇数的情况,我们已经证明了当 l + 1 ≥ r l+1\ge r l+1r f ( l , r ) f(l,r) f(l,r)的答案是 r r r,考虑利用数学归纳法证明,设对于 l , r l,r l,r r r r为奇数并且 r − l = k r-l=k rl=k满足 f ( l , r ) = r f(l,r)=r f(l,r)=r成立,那么 r + 2 − l = k + 2 r+2-l=k+2 r+2l=k+2,此时满足 r + 2 r+2 r+2为奇数,我们需要证明 f ( l , r + 2 ) = r + 2 f(l,r+2)=r+2 f(l,r+2)=r+2依然成立。考虑 g g g的定义域可以分为四种类型(下面用 g l gl gl代表 g g g的第一个参数, g r gr gr代表 g g g的第二个参数):

  1. [ g l , g r ] ⊆ [ r + 1 , r + 2 ] [gl,gr]\subseteq [r+1,r+2] [gl,gr][r+1,r+2]
  2. [ g l , g r ] ⊆ [ l , r ] [gl,gr]\subseteq [l,r] [gl,gr][l,r]
  3. g l ≤ l , g r = r + 2 gl\le l,gr=r+2 gll,gr=r+2
  4. g l ≤ l , g r = r + 1 gl\le l,gr=r+1 gll,gr=r+1

显然第1种情况下 g g g的最大值为 f ( r + 1 , r + 2 ) = r + 2 f(r+1,r+2)=r+2 f(r+1,r+2)=r+2
第2种情况下根据数学归纳法我们知道 g g g最大值为 r r r
第3种情况下我们发现 [ r + 1 , r + 2 ] ⊂ [ g l , g r ] [r+1,r+2]\subset [gl,gr] [r+1,r+2][gl,gr],由于 ( r + 1 )    x o r    ( r + 2 ) = 1 (r+1)\; xor\;(r+2)=1 (r+1)xor(r+2)=1,那么 g ( g l , g r ) = X O R i = g l g r i = ( X O R i = g l r i )    x o r    1 ≤ f ( l , r )    x o r    1 ≤ r g(gl,gr)=XOR_{i=gl}^{gr}i=(XOR_{i=gl}^{r}i)\;xor\;1\le f(l,r)\;xor\;1\le r g(gl,gr)=XORi=glgri=(XORi=glri)xor1f(l,r)xor1r,因此该情况下最大值不超过 r r r
最后一种情况稍微复杂点,我们考虑如何找到一个 g l gl gl使得 X O R i = g l g r i > r + 2 XOR_{i=gl}^{gr}i>r+2 XORi=glgri>r+2,为了达到这个目的,我们需要验证我们至少可以找到 r + 2 r+2 r+2的二进制位中的一个为 0 0 0的位,而 g ( g l , g r ) g(gl,gr) g(gl,gr)在这些位上为 1 1 1即可。我们取这些二进制位中的一个(满足 r + 2 r+2 r+2在这一位上为 0 0 0),假设这一位是 p o s ( 0 < p o s ≤ n − 1 ) pos(0< pos\le n-1) pos(0<posn1),然后从 g r gr gr开始递减找到第一个满足 p o s pos pos位为 1 1 1的数 x x x,一定有 x 0 = 1 x_0=1 x0=1,注意到 ( x + 1 ) 0 = 0 , g r 0 = 0 (x+1)_0=0,gr_0=0 (x+1)0=0,gr0=0,那么有 g r − x gr-x grx是一个奇数。为了保证 p o s pos pos位异或出来是 1 1 1,我们还需要保证从 [ g l , x ] [gl,x] [gl,x] p o s pos pos位上有奇数个 1 1 1,注意到从 x x x开始递减,恰好有偶数个数(包括 x x x)满足 p o s pos pos位为 1 1 1,继续递减的话(如果还没有变成 0 0 0)恰好有偶数个数满足 p o s pos pos 0 0 0,再继续递减的话(如果还没有变成 0 0 0)仍然是恰好有偶数个数满足 p o s pos pos 1 1 1…以此类推。这个事实意味着我们需要保证 [ g l , x ] [gl,x] [gl,x]是一个奇数长度的区间才行,否则 [ g l , x ] [gl,x] [gl,x]区间在 p o s pos pos位上为 1 1 1的数字个数必定是偶数。
结合之前 [ x + 1 , g r ] [x+1,gr] [x+1,gr]是一个奇数长度区间的结论,我们发现 [ g l , g r ] [gl,gr] [gl,gr]是一个偶数长度的区间,也就是说 g ( g l , g r ) g(gl,gr) g(gl,gr)在第 n − 1 n-1 n1位上的值是 0 0 0,显然小于 r + 2 r+2 r+2,也就是说我们无法找到一个 g l gl gl使得当 g r = r + 1 gr=r+1 gr=r+1 g ( g l , g r ) > r + 2 g(gl,gr)>r+2 g(gl,gr)>r+2,即在第4种情况下 g ( g l , g r ) ≤ r + 2 g(gl,gr)\le r+2 g(gl,gr)r+2
综合上述四个分类讨论我们证明了 f ( l , r + 2 ) = r + 2 f(l,r+2)=r+2 f(l,r+2)=r+2,根据数学归纳法我们有当 r r r是奇数的时候, f ( l , r ) = r f(l,r)=r f(l,r)=r

第三种情况就比较容易了,首先有 f ( l , r ) ≤ f ( l , r + 1 ) = r + 1 f(l,r)\le f(l,r+1)=r+1 f(l,r)f(l,r+1)=r+1(因为 r + 1 r+1 r+1是奇数),又由于 g ( r − 2 , r ) = r + 1 g(r-2,r)=r+1 g(r2,r)=r+1,故 f ( l , r ) = r + 1 f(l,r)=r+1 f(l,r)=r+1

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e6+5;
char l[maxn],r[maxn],tl[maxn];
int main(){
	int t=1;
	while(t--){
	int n;
	scanf("%d%s%s",&n,l+1,r+1);
	if(l[1]=='0' && r[1]=='1'){
		for(int i=1;i<=n;++i)printf("1");puts("");
	}else{
		bool ok=true;
		for(int i=1;i<=n;++i){
			if(l[i]!=r[i]){
				ok=false;
				break;
			}
		}
		if(!ok){
			ok=true;
			memcpy(tl,l,sizeof(char)*(n+2));
			int now=n;
			while(tl[now]=='1'){
				tl[now]='0';
				now--;
			}
			tl[now]='1';
			for(int i=1;i<=n;++i){
				if(tl[i]!=r[i]){
					ok=false;
					break;
				}
			}
		}
		if(ok){
			printf("%s\n",r+1);
		}else{
			r[n]='1';
			printf("%s\n",r+1);
		}
	}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值