use std::collections::*; fn getline() -> String { let mut ret = String::new(); std::io::stdin().read_line(&mut ret).unwrap(); ret } #[derive(Debug)] struct Stat { l: usize, r: usize, unique: BTreeSet, // index freq: HashMap, } fn facil(a: &[u32], l: usize, r: usize) -> Stat { let b = &a[l..r]; let mut freq = HashMap::new(); for &f in b { *freq.entry(f).or_insert(0) += 1; } let stat = Stat { l, r, unique: { let mut x = BTreeSet::new(); for i in l..r { if freq[&a[i]] == 1 { x.insert(i); } } x }, freq, }; stat } fn rec(a: &[u32], s: Stat) -> i32 { let n = a.len(); let mut seen = s.l; let mut ans = 0; for &idx in &s.unique { // TODO: O(n^2) let t = facil(&a, seen, idx); ans += rec(a, t) + 1; seen = idx + 1; } if seen > s.l && seen < s.r { let t = facil(&a, seen, s.r); ans += rec(a, t); } // eprintln!("stat = {s:?}, ans = {ans}"); ans } // https://yukicoder.me/problems/no/3258 (3.5) fn main() { getline(); let f = getline().trim().split_whitespace() .map(|x| x.parse::().unwrap()) .collect::>(); let n = f.len(); let mut freq = HashMap::new(); for &f in &f { *freq.entry(f).or_insert(0) += 1; } let stat = Stat { l: 0, r: n, unique: { let mut x = BTreeSet::new(); for i in 0..n { if freq[&f[i]] == 1 { x.insert(i); } } x }, freq, }; println!("{}", if rec(&f, stat) % 2 == 1 { "Alice" } else { "Bob" }); }