Open2

競プロで使えそうなRustコード片

FFFF

ランレングス圧縮

A A A A A B B B B B B B B B A A Aのような連続する文字列をA5B9A3のように(文字,回数)の対にして長さを圧縮する.

例題

https://atcoder.jp/contests/abc136/tasks/abc136_d

ランレングス圧縮を行えば色々処理が楽になる.

fn rlc(s: &[char]) -> Vec<(char, usize)> {
    let mut i = 0;
    let mut ctr = vec![];
    let mut cur = (s[0], 0);
    loop {
        while i < s.len() && s[i] == cur.0 {
            cur.1 += 1;
            i += 1;
        }
        ctr.push(cur);
        if i == s.len() {
            break;
        } else {
            cur = (s[i], 0);
        }
    }
    ctr
}
FFFF

ベクトルを空白区切りで出力する

競プロでは出力でありがちだけどどうするのが一番手っ取り早いのか.

Vec<String>ならば.join(" ")などとするのが速そうだがそうでないような場合はどうしよう.

いまのところは以下のを使ってる.

fn print_vec<T: std::fmt::Display>(v: &[T]) {
    if v.len() == 0 {
        println!();
    } else {
        let mut v = v.iter();
        print!("{}", v.next().unwrap());
        for v in v {
            print!(" {}", v);
        }
        println!();
    }
}

AtCoderではtrailing spaceは無視してくれるので要素ごとにprint!("{} ", v)して最後に改行でも良さそうだけどなんかやだなあ.