const SIZE: usize = 26; fn main() { let mut n = String::new(); std::io::stdin().read_line(&mut n).ok(); let n: usize = n.trim().parse().unwrap(); let words = (0..n).map(|_| { let mut temp = String::new(); std::io::stdin().read_line(&mut temp).ok(); let temp = temp.trim(); temp.chars().collect::>() }) .collect::>(); let mut words = words.iter().filter(|&v| { let mut temp = v.clone().to_owned(); temp.sort(); v == &temp }) .collect::>(); words.sort_by_key(|&v| v[v.len()-1]); let n = words.len(); let mut dp = vec![vec![0usize; SIZE]; n+1]; for i in 0..n { let start = words[i][0] as usize - 'a' as usize; let end = words[i][words[i].len()-1] as usize - 'a' as usize; let val = words[i].len(); for j in 0..SIZE { dp[i+1][j] = dp[i+1][j].max(dp[i][j]); if j > 0 { dp[i+1][j] = dp[i+1][j].max(dp[i+1][j-1]); } if j <= start { dp[i+1][end] = dp[i+1][end].max(dp[i][j] + val); } } } println!("{}", dp[n][SIZE-1]); }