beephsupreme icon

create_strings.rs

beephsupreme | PRO | 09/13/22 10:03:38 PM UTC (Edited) | 0 ⭐ | 7995 👁️ | Never ⏰ | []
Rust |

2.19 KB

|

None

|

0 👍

/

0 👎

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());
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎