AtCoder Beginner Contest 447 D

https://atcoder.jp/contests/abc447/tasks/abc447_d

Aはなるべく左から取ったほうがよくて、BもAより右でなるべく左から取ったほうがよくて、という感じなので、尺取り法的に行えばよいです。

// Take ABC 2
#![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 F(S: String) -> i32 {
    let cs: Vec<char> = S.chars().collect();
    let L = cs.len();
    let mut counter: i32 = 0;
    let mut k: usize = 0;
    let mut l: usize = 0;
    let mut m: usize = 0;
    while k < L && l < L && m < L {
        if cs[k] != 'A' {
            k += 1
        }
        else if l <= k || cs[l] != 'B' {
            l += 1
        }
        else if m <= l || cs[m] != 'C' {
            m += 1
        }
        else {
            counter += 1;
            k += 1;
            l += 1;
            m += 1
        }
    }
    counter
}

fn main() {
    let S: String = read();
    println!("{}", F(S))
}