Loading

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\}\)

分析

  1. \(l\)\(r\)最高位不同,则可以找到\((2^{x-1}-1)\oplus 2^{x-1} = 2^x-1\)。可以证明不存在比\(2^x-1\)大的答案
  2. 否则\(l\)\(r\)最高位相同(为1),设\(len=y-x+1\),则\(len\)为奇数(使最高位异或结果为1)。
  3. 因为\(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\)
  4. 则答案为\(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;
}
posted @ 2021-03-14 17:07  intmian  阅读(58)  评论(0编辑  收藏  举报