解体思路:
整个元组Vec total
存储每个结点和其位置,再整个Vec addr
来存储 total
中的每个需要记录的头结点,也就是在 R
中的排序后不重复的结点,最后注意输出格式就行。
整体评价:
此种方法虽然所使用的数组较多,即v_i
、v_r
、total
、addr
,但是解题方法较为朴素,思路较为清晰。
时间复杂度为O(m*n)
use std::io;
#[allow(unused_assignments)]
fn main() {
let mut s = String::new();
let mut v_i = vec![];
let mut v_r = vec![];
let mut total: Vec<(usize, &str)> = vec![];
let mut addr = Vec::new();
io::stdin().read_line(&mut s).expect("Failed to read line");
v_i = Vec::from(s.trim().split(" ").collect::<Vec<&str>>());
v_i.remove(0);//去除头部结点,会有相应的损耗,因为 remove(0) 就是最坏情况 O(n)
let mut s = String::new();
io::stdin().read_line(&mut s).expect("Failed to read line");
v_r = Vec::from(s.trim().split(" ").collect::<Vec<&str>>());
v_r.remove(0);
v_r.sort_by(|a, b| ((*a).parse::<u32>().unwrap()).cmp(&((*b).parse::<u32>().unwrap())));//转换成u32型数字的排序
v_r.dedup();
for i in v_r.iter() {
total.push((0, *i));
addr.push(total.len() - 1);
for (k, j) in v_i.iter().enumerate() {
if (*j).contains(*i) {
total.push((k, *j));
total[addr[addr.len() - 1]].0 += 1;
}
}
if total[addr[addr.len() - 1]].0 == 0 {//去除未找到匹配值的结点
total.pop();
addr.pop();
}
}
print!("{} ", total.len() * 2);
let mut j = 0usize;
for i in 0..total.len() {
if j < addr.len() && i == addr[j] {
print!("{} {} ", total[i].1, total[i].0);
j += 1;
} else {
print!("{} {} ", total[i].0, total[i].1);
}
}
}