AtCoder Beginner Contest 295 D

https://atcoder.jp/contests/abc295/tasks/abc295_d

左から見ていって、各数字の出現回数の偶奇が同じなら、その区間は各数字が偶数回出現していることになります。

// Three Days Ago
#![allow(non_snake_case)]


//////////////////// library ////////////////////

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}


//////////////////// process ////////////////////

fn read_input() -> Vec<i32> {
    let S: String = read();
    S.chars().map(|c| (c as i32) - 48).collect::<Vec<i32>>()
}

fn f(ds: Vec<i32>) -> u64 {
    let mut a: Vec<u64> = (0..1024).map(|_| 0).collect();
    let mut flags: usize = 0;
    a[flags] += 1;
    for d in ds.iter() {
        flags ^= (1 << d) as usize;
        a[flags] += 1
    }
    a.iter().map(|n| n * (n - 1) / 2).sum()
}

fn main() {
    let ds = read_input();
    println!("{}", f(ds))
}