Module c

Expand description

ยงABC 372 C - Count ABC Again

refs: https://atcoder.jp/contests/abc372/tasks/abc372_c

use proconio::{input, marker::Chars};

fn main() {
    input! {
        n: usize, q: usize,
        mut s: Chars,
        queries: [(usize, char); q],
    }

    let mut ans = 0;
    for i in 0..(n - 2) {
        if s[i..=(i + 2)] == ['A', 'B', 'C'] {
            ans += 1;
        }
    }

    for (x, c) in queries {
        let idx = x - 1;
        if 2 <= idx {
            match ((s[idx - 2], s[idx - 1], s[idx]), c) {
                (('A', 'B', 'C'), 'C') => {}
                (('A', 'B', 'C'), _) => ans -= 1,
                (('A', 'B', _), 'C') => ans += 1,
                _ => {}
            }
        }
        if 1 <= idx && idx < n - 1 {
            match ((s[idx - 1], s[idx], s[idx + 1]), c) {
                (('A', 'B', 'C'), 'B') => {}
                (('A', 'B', 'C'), _) => ans -= 1,
                (('A', _, 'C'), 'B') => ans += 1,
                _ => {}
            }
        }
        if idx < n - 2 {
            match ((s[idx], s[idx + 1], s[idx + 2]), c) {
                (('A', 'B', 'C'), 'A') => {}
                (('A', 'B', 'C'), _) => ans -= 1,
                ((_, 'B', 'C'), 'A') => ans += 1,
                _ => {}
            }
        }
        s[idx] = c;
        println!("{ans}");
    }
}