Submission #74712552


Source Code Expand

use proconio::input;
use itertools::Itertools;

struct Trie {
    ch: Vec<[usize; 2]>,
    cnt: Vec<usize>,
}

impl Trie {
    fn new() -> Self {
        Self { ch: vec![[0, 0]], cnt: vec![0] }
    }

    fn insert(&mut self, val: usize) {
        let mut u = 0;
        self.cnt[0] += 1;
        for i in (0..19).rev() {
            let b = (val >> i) & 1;
            if self.ch[u][b] == 0 {
                self.ch[u][b] = self.ch.len();
                self.ch.push([0, 0]);
                self.cnt.push(0);
            }
            u = self.ch[u][b];
            self.cnt[u] += 1;
        }
    }

    fn query_and_remove(&mut self, val: usize) -> usize {
        let mut u = 0;
        let mut p = 0;
        self.cnt[0] -= 1;
        for i in (0..19).rev() {
            let b = (val >> i) & 1;
            let preferred = b;
            let next;
            if self.ch[u][preferred] != 0 && self.cnt[self.ch[u][preferred]] > 0 {
                next = self.ch[u][preferred];
                p |= (preferred << i);
            } else {
                next = self.ch[u][1 - preferred];
                p |= ((1 - preferred) << i);
            }
            u = next;
            self.cnt[u] -= 1;
        }
        p
    }
}

fn main() {
    input! {
        T: usize,
    }
    for _ in 0..T {
        input! {
            N: usize,
        }

        let mut trie = Trie::new();
        for i in 1..=N {
            trie.insert(i);
        }

        let mut cur = 0;
        let mut ans = Vec::with_capacity(N);
        for _ in 0..N {
            let p = trie.query_and_remove(cur);
            ans.push(p);
            cur ^= p;
        }

        println!("{}", ans.into_iter().join(" "));
    }
}

Submission Info

Submission Time
Task A - Min of Sum of XOR
User memoka
Language Rust (rustc 1.89.0)
Score 500
Code Size 1787 Byte
Status AC
Exec Time 28 ms
Memory 14296 KiB

Compile Error

warning: unnecessary parentheses around assigned value
  --> src/main.rs:39:22
   |
39 |                 p |= (preferred << i);
   |                      ^              ^
   |
   = note: `#[warn(unused_parens)]` on by default
help: remove these parentheses
   |
39 -                 p |= (preferred << i);
39 +                 p |= preferred << i;
   |

warning: unnecessary parentheses around assigned value
  --> src/main.rs:42:22
   |
42 |                 p |= ((1 - preferred) << i);
   |                      ^                    ^
   |
help: remove these parentheses
   |
42 -                 p |= ((1 - preferred) << i);
42 +                 p |= (1 - preferred) << i;
   |

warning: variable `T` should have a snake case name
  --> src/main.rs:53:9
   |
53 |         T: usize,
   |         ^ help: convert the identifier to snake case: `t`
   |
   = note: `#[warn(non_snake_case)]` on by default

warning: variable `N` should have a snake case name
  --> src/main.rs:57:13
   |
57 |             N: usize,
   |             ^ help: convert the identifier to snake case: `n`

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 1
AC × 14
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 2012 KiB
01_random_00.txt AC 28 ms 14236 KiB
01_random_01.txt AC 28 ms 14232 KiB
01_random_02.txt AC 27 ms 14296 KiB
01_random_03.txt AC 27 ms 14248 KiB
01_random_04.txt AC 27 ms 14216 KiB
01_random_05.txt AC 27 ms 14248 KiB
01_random_06.txt AC 27 ms 14184 KiB
01_random_07.txt AC 27 ms 14212 KiB
01_random_08.txt AC 27 ms 14172 KiB
01_random_09.txt AC 27 ms 14176 KiB
01_random_10.txt AC 22 ms 2180 KiB
01_random_11.txt AC 21 ms 2124 KiB
01_random_12.txt AC 22 ms 1936 KiB