算法竞赛中rust的一种比较健壮的读入
阅读量:
searchstar
2020-08-25 23:53:13
Categories:
Tags:
以PAT 甲级1004为例:https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805521431773184?type=7&page=0
关键部位
fn main() { let mut buf = String::new(); while io::stdin().read_line(&mut buf).unwrap() > 0 { let line = buf.trim(); if line.len() == 0 { continue; } let mut s = line.split_whitespace(); let n: usize = s.next().unwrap().parse().unwrap(); if 0 == n { break; } let m: usize = s.next().unwrap().parse().unwrap(); work(n, m); buf.clear(); } }
|
这样遇到空行也不会panic。

注意有一组测试数据是用非空格或者多个空格隔开的,所以要用split_whitespace
。
ps: 还可以用BufReader加速stdin读取:https://seekstar.github.io/2021/11/17/rust%E7%94%A8bufreader%E5%8A%A0%E9%80%9Fstdin%E8%AF%BB%E5%8F%96/
完整代码:
use std::io; use std::cmp;
fn dfs(mut cnt: &mut Vec<usize>, cur: usize, depth: usize, childs: &Vec<Vec<usize>>) -> usize { if childs[cur].is_empty() { cnt[depth] += 1; return depth + 1; } let mut mx = 0usize; for v in &childs[cur] { let v = *v; mx = cmp::max(mx, dfs(&mut cnt, v, depth + 1, &childs)); } return mx; }
fn work(n: usize, m: usize) { let mut childs = vec![Vec::new(); n + 1]; for _i in 0..m { let mut input = String::new(); io::stdin().read_line(&mut input).unwrap(); let mut s = input.trim().split_whitespace(); let fa: usize = s.next().unwrap().parse().unwrap(); let num: usize = s.next().unwrap().parse().unwrap(); for _i in 0..num { let c: usize = s.next().unwrap().parse().unwrap(); childs[fa].push(c); } } let mut cnt = vec![0usize; n + 10]; let depth = dfs(&mut cnt, 1, 0, &childs); print!("{}", cnt[0]); for i in 1..depth { print!(" {}", cnt[i]); } println!(); }
fn main() { let mut buf = String::new(); while io::stdin().read_line(&mut buf).unwrap() > 0 { let line = buf.trim(); if line.len() == 0 { continue; } let mut s = line.split_whitespace(); let n: usize = s.next().unwrap().parse().unwrap(); if 0 == n { break; } let m: usize = s.next().unwrap().parse().unwrap(); work(n, m); buf.clear(); } }
|