use std::fmt::Debug; use std::io::*; fn reader() -> WordReader { WordReader::new() } fn writer() -> BufWriter { BufWriter::new(stdout()) } struct WordReader { buf: Vec, pos: usize, lock: std::io::StdinLock<'static>, } impl WordReader { fn new() -> Self { let r = unsafe { &*Box::into_raw(Box::new(stdin())) }; Self { lock: r.lock(), buf: Vec::new(), pos: 0, } } fn next_line(&mut self) -> bool { self.buf.clear(); self.pos = 0; self.lock.read_until(b'\n', &mut self.buf).unwrap_or(0) > 0 } fn is_whitespace(c: u8) -> bool { c == b' ' || c == b'\r' || c == b'\n' || c == b'\t' } fn byte(&mut self) -> Option { if self.pos == self.buf.len() && !self.next_line() { return None; } self.pos += 1; Some(self.buf[self.pos - 1]) } fn vb(&mut self) -> Vec { let mut vector = Vec::with_capacity(8); let mut b = false; while let Some(c) = self.byte() { if !Self::is_whitespace(c) { vector.push(c); b = true; } else if b { break; } } vector } } fn next_permutation(vector: &mut [T]) -> bool { let n = vector.len(); for i in (0..n - 1).rev() { if vector[i] < vector[i + 1] { for j in (i + 1..n).rev() { if vector[i] < vector[j] { vector.swap(i, j); break; } } vector[i + 1..n].reverse(); return true; } } false } fn main() { let mut input = reader(); let mut output = writer(); let mut vector = input.vb(); vector.sort(); let mut result = Vec::new(); result.push(vector.clone()); while next_permutation(&mut vector) { result.push(vector.clone()); } writeln!(output, "{}", result.len()).ok(); result .into_iter() .for_each(|r| writeln!(output, "{}", String::from_utf8(r).unwrap()).unwrap()); }