fork download
  1. use std::collections::HashMap;
  2. fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
  3. let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
  4. let mut acc = Vec::<Vec<&str>>::new();
  5. for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
  6. match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
  7. (Some(xi), Some(yi)) => {
  8. let ys = acc[yi].clone();
  9. acc[xi].extend(ys);
  10. acc.remove(yi);
  11. },
  12. (Some(xi), None) => acc[xi].push(xy[1]),
  13. (None, Some(yi)) => acc[yi].push(xy[0]),
  14. _ => acc.push(xy),
  15. }
  16. }
  17. acc.iter_mut().for_each(|b| b.sort_by(|c, d| h.get(d).cmp(&h.get(c))));
  18. acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
  19. acc
  20. }
  21. fn main() {
  22. let v = ["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
  23. "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
  24. "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"];
  25. println!("{:?}", f(&v));
  26. }
Success #stdin #stdout 0s 5308KB
stdin
Standard input is empty
stdout
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], ["c1", "c2", "c3", "c4", "d1", "d2", "d3"], ["e1", "e2", "e3"]]