Open2
競プロで使えそうなRustコード片
ランレングス圧縮
A A A A A B B B B B B B B B A A A
のような連続する文字列をA5B9A3
のように(文字,回数)の対にして長さを圧縮する.
例題
ランレングス圧縮を行えば色々処理が楽になる.
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
}
ベクトルを空白区切りで出力する
競プロでは出力でありがちだけどどうするのが一番手っ取り早いのか.
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)
して最後に改行でも良さそうだけどなんかやだなあ.