Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::fmt::Debug;
- use std::io::*;
- fn reader() -> WordReader {
- WordReader::new()
- }
- fn writer() -> BufWriter<Stdout> {
- BufWriter::new(stdout())
- }
- struct WordReader {
- buf: Vec<u8>,
- 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<u8> {
- 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<u8> {
- 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<T: Ord + Debug>(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());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement