codeforces1493E Enormous XOR (Codeforces Round #705 Div. 2)
题意
给定\(n\)和二进制表示的数\(0\le l\le r<2^n(1\le n\le 10^6)\),求\(max_{l\le x\le y\le r}\{x\oplus(x+1)\oplus\dots\oplus(y-1)\oplus y\}\)
分析
- 若\(l\)与\(r\)最高位不同,则可以找到\((2^{x-1}-1)\oplus 2^{x-1} = 2^x-1\)。可以证明不存在比\(2^x-1\)大的答案
- 否则\(l\)与\(r\)最高位相同(为1),设\(len=y-x+1\),则\(len\)为奇数(使最高位异或结果为1)。
- 因为\(x\oplus(x+1)=1\)(\(x\)为偶数),所以结果为\(x\)(\(x\)为奇数,\(len\%4=1\))或\(x\oplus 1\)(\(x\)为奇数,\(len\%4=3\))或\(y\)(\(x\)为偶数,\(len\%4=1\))或\(y\oplus1\)(\(x\)为偶数,\(len\%4=3\))
- 则答案为\(r(r\%2==1 ||r\%2==0 \&\&len<3)\),或\(r+1(r\%2==0 \&\&len\ge3)\)
代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxn=1e6+5;
int n;
char s[2][maxn];
void add(){
s[0][n]++;
for(int i=n;i>=1;i--)
{
if(s[0][i]<='1')
return;
else
{
s[0][i]='0';
s[0][i-1]++;
}
}
}
int cmp(){
for(int i=0;i<=n;i++)
{
if(s[0][i]!=s[1][i])
{
if(s[0][i]<s[1][i])
return -1;
else
return 1;
}
}
return 0;
}
void solve(){
cin>>n>>(s[0]+1)>>(s[1]+1);
s[0][0]=s[1][0]='0';
for(int i=0;i<=n;i++)
{
if(s[0][i]-'0' || s[1][i]-'0')
{
if(s[0][i] != s[1][i])
{
for(int j=i;j<=n;j++)
cout<<1;
cout<<'\n';
}
else
{
if(s[1][n]=='0')
{
int t=2;
bool flag=true;
while(t--)
{
if(cmp()<0)
add();
else
flag=false;
}
if(flag)
s[1][n]='1';
}
cout<<(s[i]+1)<<'\n';
}
return;
}
}
cout<<"0\n";
}
int main()
{
ios::sync_with_stdio(false);
int t=1;
// cin>>t;
while(t--)
solve();
return 0;
}