AtCoder Beginner Contest 380 D

https://atcoder.jp/contests/abc380/tasks/abc380_d

Sの次は、ST、その次はSTTS、その次はSTTSTSSTとなります。
例えば、0-baseで6番目なら、4を引いて2、2を引いて0なので、0に到達するまでに2回です。1回ごとに反転するので、2回ならSになります。

// Strange Mirroring
#![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()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect()
}

fn floor_log2(i: usize) -> i32 {
    if i == 1 {
        0
    }
    else {
        1 + floor_log2(i >> 1)
    }
}


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

fn read_input() -> (String, Vec<usize>) {
    let S: String = read();
    let _Q: usize = read();
    let K: Vec<usize> = read_vec();
    (S, K)
}

// i番目はSか
fn f(i: usize) -> bool {
    if i == 0 {
        true
    }
    else {
        !f(i - (1 << floor_log2(i)))
    }
}

fn inverse(c: char) -> char {
    if c.is_lowercase() {
        c.to_uppercase().next().unwrap()
    }
    else {
        c.to_lowercase().next().unwrap()
    }
}

fn F_each(i: usize, S: &String) -> String {
    let q = (i - 1) / S.len();
    let r = (i - 1) % S.len();
    let c = S.as_bytes()[r] as char;
    if f(q) {
        String::from(c)
    }
    else {
        String::from(inverse(c))
    }
}

fn F(S: String, K: Vec<usize>) {
    println!("{}",
        K.into_iter().map(|i| F_each(i, &S)).collect::<Vec<String>>().join(" "))
}

fn main() {
    let (S, K) = read_input();
    F(S, K)
}