解体思路
整个元组Vec total存储每个结点和其位置,再整个Vec addr 来存储 total 中的每个需要记录的头结点,也就是在 R 中的排序后不重复的结点,最后注意输出格式就行。
整体评价: 此种方法虽然所使用的数组较多,即v_iv_rtotaladdr,但是解题方法较为朴素,思路较为清晰。 时间复杂度为O(m*n)
alt

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);
        }
    }
}