Submission #101939


Source Code Expand

#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>

using namespace std;

const int INF = 1000000000;
const int LIM = 1<<20;
// exists[bit][n]
bool exists[20][LIM];
pair<int,int> original[LIM];

void check_upd(pair<int,int> &var, pair<int,int> cand) {
    if(cand.first > cand.second) swap(cand.first, cand.second);
    if(var.first == -INF || var.first == INF || var.second == -INF || var.second == INF) {
        var = cand;
    } else if(cand.first == -INF || cand.first == INF || cand.second == -INF || cand.second == INF) {
        return;
    } else {
        var = min(var, cand);
    }
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);

    int N;
    cin >> N;
    fill_n(original, original+LIM, make_pair(INF, -INF));
    for(int i = 0; i < 20; ++i) {
        for(int j = 0; j < LIM; ++j) {
            exists[i][j] = false;
        }
    }

    int acc = 0;
    bool all_zero = true;
    exists[19][0] = true;
    original[0] = make_pair(-1, -1);
    for(int i = 0; i < N; ++i) {
        int a;
        cin >> a;
        if(a != 0) {
            all_zero = false;
        }
        acc ^= a;
        exists[19][acc] = true;
        //cout << acc << endl;
        original[acc].first = min(original[acc].first, i);
        original[acc].second = max(original[acc].second, i);
    }
    if(all_zero) {
        cout << "0 1 1" << endl;
        return 0;
    }
    // construct segtree
    for(int bit = 18; bit >= 0; --bit) {
        const int last = 1 << (bit+1);
        int pos = 0;
        for(int i = 0; i < last; ++i) {
            for(int j = 0; j < 2; ++j) {
                if(exists[bit+1][pos+j]) {
                    //if(!exists[bit][i]) cout << "true " << bit << ' ' << i << endl;
                    exists[bit][i] = true;
                }
            }
            pos += 2;
        }
    }

    // traverse
    pair<int,int> ans(INF, -INF);
    int ans_val = 0;
    for(int i = 0; i < LIM; ++i) {
        if(!exists[19][i]) continue;
        //cout << "for " << i  << endl;
        // [left, right)
        int left = 0, right = 1;
        for(int bit = 0; bit < 20; ++bit) {
            //cout << bit << ' ' << left << ' ' << right << endl;
            int prefer = !(i & (1<<(19-bit)));
            int prefer_idx = (prefer == 0) ? left : right;
            int next = -1;
            if(exists[bit][prefer_idx]) {
                next = prefer_idx;
            } else if(exists[bit][left]) {
                next = left;
            } else if(exists[bit][right]) {
                next = right;
            } else {
                assert(0);
            }
            left = next*2;
            right = left+1;
        }
        const int pos = left/2;
        assert(exists[19][pos]);
        //cout << "select " << pos << endl;
        const int val = i ^ pos;
        if(val >= ans_val) {
            if(val > ans_val) {
                ans = make_pair(INF, -INF);
            }
            const auto &a = original[i];
            const auto &b = original[pos];
            auto cand = make_pair(original[i].first, original[pos].first);
            check_upd(cand, make_pair(original[i].first, original[pos].second));
            check_upd(cand, make_pair(original[i].second, original[pos].first));
            check_upd(cand, make_pair(original[i].second, original[pos].second));
            ans = min(ans, cand);
            //cout << "ans became " << ans.first << ' ' << ans.second << endl;
            ans_val = val;
        }
    }
    cout << ans_val << ' ' << ans.first+2 << ' ' << ans.second+1 << endl;
    return 0;
}

Submission Info

Submission Time
Task F - Maximum Segment XOR
User binding_pry
Language C++11 (GCC 4.8.1)
Score 100
Code Size 3721 Byte
Status AC
Exec Time 145 ms
Memory 29604 KB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 31
Set Name Test Cases
All 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 4, 5, 6, 7, 8, 9
Case Name Status Exec Time Memory
1 AC 89 ms 29432 KB
10 AC 90 ms 29480 KB
11 AC 86 ms 29476 KB
12 AC 87 ms 29476 KB
13 AC 91 ms 29476 KB
14 AC 91 ms 29468 KB
15 AC 95 ms 29480 KB
16 AC 120 ms 29484 KB
17 AC 110 ms 29468 KB
18 AC 145 ms 29476 KB
19 AC 90 ms 29476 KB
2 AC 88 ms 29432 KB
20 AC 88 ms 29476 KB
21 AC 87 ms 29480 KB
22 AC 87 ms 29476 KB
23 AC 89 ms 29480 KB
24 AC 89 ms 29472 KB
25 AC 90 ms 29480 KB
26 AC 87 ms 29472 KB
27 AC 91 ms 29472 KB
28 AC 126 ms 29432 KB
29 AC 130 ms 29604 KB
3 AC 89 ms 29484 KB
30 AC 113 ms 29476 KB
31 AC 128 ms 29464 KB
4 AC 85 ms 29468 KB
5 AC 90 ms 29480 KB
6 AC 91 ms 29480 KB
7 AC 88 ms 29480 KB
8 AC 86 ms 29476 KB
9 AC 86 ms 29476 KB