2
pub fn shortest_superstring(words: Vec<String>) -> String {4
let mut graph = vec![vec![0; n]; n];8
let mut k = words[j].len();9
while !words[i].ends_with(&words[j][..k]) {16
let mut dp = vec![vec![0; n]; 1 << n];17
let mut parent = vec![vec![None; n]; 1 << n];18
for mask in 0..1 << n {20
if mask >> b & 1 == 0 {23
let prev = mask ^ 1 << b;24
for (i, row) in graph.iter().enumerate() {25
if prev >> i & 1 == 0 {28
let val = dp[prev][i] + row[b];29
if val > dp[mask][b] {31
parent[mask][b] = Some(i);36
let mut mask = (1 << n) - 1;37
let mut perm = Vec::with_capacity(n);38
let mut seen = vec![false; n];39
if let Some(mut p) = (0..n).max_by_key(|&i| dp[(1 << n) - 1][i]) {43
if let Some(t) = parent[mask][p] {51
perm.extend((0..n).filter(|&i| !seen[i]));54
.fold(words[perm[n - 1]].clone(), |acc, i| {55
let overlap = graph[perm[i]][perm[i - 1]];56
acc + &words[perm[i - 1]][overlap..]