@coeuvre wrote:
The code seems ok but I don't know why it is SIGKILL? Help me, pls!
use std::io::{self, BufRead}; fn main() { let stdin = io::stdin(); let mut lines = stdin.lock().lines(); let t = lines.next().unwrap().unwrap().parse::<usize>().unwrap(); for _ in 0..t { let digits: Vec<char> = lines.next().unwrap().unwrap().chars().collect(); let mut palindrome = make_palindrome(&digits); while !is_less(&digits, &palindrome) { palindrome = next_palindrome(palindrome); } let result: String = palindrome.into_iter().collect(); println!("{}", result); } } fn center(digits: &Vec<char>) -> (usize, usize) { if digits.len() % 2 == 0 { let c = digits.len() / 2; (c - 1, c) } else { let c = digits.len() / 2; (c, c) } } fn make_palindrome(digits: &Vec<char>) -> Vec<char> { let (pos1, pos2) = center(digits); let mut palindrome = Vec::with_capacity(digits.len()); for ch in digits.iter().take(pos1 + 1) { palindrome.push(*ch); } for i in pos2..digits.len() { let j = digits.len() - i - 1; if i == j { continue; } let ch = palindrome[j]; palindrome.push(ch); } palindrome } fn next_palindrome(palindrome: Vec<char>) -> Vec<char> { let (pos1, pos2) = center(&palindrome); fn next(mut palindrome: Vec<char>, pos1: i32, pos2: i32) -> Vec<char> { if pos1 < 0 { *palindrome.last_mut().unwrap() = '1'; palindrome.insert(0, '1'); palindrome } else if palindrome[pos1 as usize] < '9' { let n = (palindrome[pos1 as usize] as u8 + 1) as char; palindrome[pos1 as usize] = n; palindrome[pos2 as usize] = n; palindrome } else { palindrome[pos1 as usize] = '0'; palindrome[pos2 as usize] = '0'; next(palindrome, pos1 - 1, pos2 + 1) } }; next(palindrome, pos1 as i32, pos2 as i32) } fn is_less(v1: &Vec<char>, v2: &Vec<char>) -> bool { if v1.len() != v2.len() { return v1.len() < v2.len(); } for (ch1, ch2) in v1.iter().zip(v2.iter()) { if ch1 != ch2 { return ch1 < ch2; } } // v1 is equal to v2 false }