paranid5

~E

Jul 16th, 2020
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.05 KB | None | 0 0
  1. use std::collections::VecDeque;
  2. use std::io;
  3.  
  4. fn input() -> u32 {
  5.     let mut input: String = String::new();
  6.     io::stdin().read_line(&mut input).unwrap();
  7.     input.trim().parse().unwrap()
  8. }
  9.  
  10. fn find(pn: &Vec<u32>, value: u32) -> Option<usize> {
  11.     for i in 0..pn.len() {
  12.         unsafe {
  13.             if value == *pn.get_unchecked(i) {
  14.                 return Some(i);
  15.             }
  16.         }
  17.     }
  18.     return None;
  19. }
  20.  
  21. fn find_deque(pn: &VecDeque<u32>, value: u32) -> Option<usize> {
  22.     for i in 0..pn.len() {
  23.         if value == pn[i] {
  24.             return Some(i);
  25.         }
  26.     }
  27.     return None;
  28. }
  29.  
  30. fn binary_add(x: &mut VecDeque<u32>) {
  31.     let mut size: usize = 0;
  32.     {
  33.         size = x.len()
  34.     }
  35.     if *x.back().unwrap() == 0 {
  36.         x[size - 1] = 1;
  37.     } else {
  38.         let mut end_ptr: usize = 1;
  39.         while x[size - end_ptr] == 1 {
  40.             x[size - end_ptr] = 0;
  41.             end_ptr += 1;
  42.         }
  43.         x[size - end_ptr] = 1;
  44.     }
  45. }
  46.  
  47. fn remove_all_sums(ans: &Vec<u32>, list: &mut Vec<u32>, mut permute: &mut VecDeque<u32>) {
  48.     while find_deque(&permute, 0) != None {
  49.         binary_add(&mut permute);
  50.  
  51.         let mut sum: u32 = 0;
  52.  
  53.         for i in 0..ans.len() {
  54.             unsafe {
  55.                 if permute[i] == 1 {
  56.                     sum += *ans.get_unchecked(ans.len() - 1 - i) as u32;
  57.                 }
  58.             }
  59.         }
  60.         let x: usize;
  61.         {
  62.             x = find(&list, sum).unwrap();
  63.         }
  64.         list.remove(x);
  65.     }
  66. }
  67.  
  68. fn main() {
  69.     let n: u32 = input();
  70.     let mut list: Vec<u32> = Vec::with_capacity(2_usize.pow(n));
  71.  
  72.     for _i in 0..2_usize.pow(n) {
  73.         let x: u32 = input();
  74.         list.push(x);
  75.     }
  76.     list.sort();
  77.  
  78.     let mut ans: Vec<u32> = Vec::with_capacity(n as usize);
  79.  
  80.     let mut correct: bool = true;
  81.  
  82.     for i in 0..list.len() / 2 {
  83.         unsafe {
  84.             if *list.get_unchecked(i)
  85.                 != list.last().unwrap() - *list.get_unchecked(list.len() - 1 - i)
  86.             {
  87.                 correct = false;
  88.                 break;
  89.             }
  90.         }
  91.     }
  92.  
  93.     if !correct {
  94.         print!("impossible");
  95.     } else {
  96.         list.remove(0); // убрали 0
  97.         ans.push(*list.first().unwrap());
  98.         list.remove(0); // убрали 1 элемент
  99.         if !list.is_empty() {
  100.             ans.push(*list.first().unwrap());
  101.             list.remove(0);
  102.         }
  103.  
  104.         let mut permute: VecDeque<u32> = VecDeque::with_capacity(n as usize);
  105.         permute.push_back(1);
  106.         permute.push_back(1);
  107.         if !list.is_empty() {
  108.             unsafe {
  109.                 let z: usize;
  110.                 {
  111.                     z = find(&list, ans.get_unchecked(0) + ans.get_unchecked(1)).unwrap();
  112.                 }
  113.                 list.remove(z);
  114.             }
  115.         }
  116.  
  117.         while ans.len() < n as usize - 1 {
  118.             ans.push(*list.first().unwrap());
  119.             permute.push_front(0);
  120.             remove_all_sums(&ans, &mut list, &mut permute);
  121.         }
  122.         if n > 2 {
  123.             ans.push(*list.first().unwrap());
  124.         }
  125.  
  126.         for i in ans {
  127.             println!("{}", i);
  128.         }
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment