use std::io; use std::io::BufRead; use std::io::Lines; use std::io::StdinLock; use std::collections::HashMap; #[derive(Debug)] struct Input { yuki_hotel_fee: u32, other_hotel_fee: u32, count: u32, reservations: Vec } fn read_next(iter: &mut Lines) -> Option { match iter.next() { Some(res) => Some(res.unwrap().parse().unwrap()), None => None } } fn create_input() -> Input { let mut reservations = Vec::new(); let stdin = io::stdin(); let mut lines = stdin.lock().lines(); let yuki_fee = read_next(&mut lines).unwrap(); let other_fee = read_next(&mut lines).unwrap(); let count = read_next(&mut lines).unwrap(); while let Some(data) = read_next(&mut lines) { reservations.push(data); } Input {yuki_hotel_fee: yuki_fee, other_hotel_fee: other_fee, count: count, reservations: reservations} } fn calcurate(input: &Input) -> u32 { let res = input.reservations.iter().fold((0, HashMap::new()), |mut acc, x| { if acc.1.contains_key(x) { let value = acc.1.get_mut(x).unwrap(); *value += 1; acc.0 += 1; } else { acc.1.insert(x, 1); } acc }); (input.yuki_hotel_fee + input.other_hotel_fee) * res.0 } fn main() { let input = create_input(); let result = calcurate(&input); println!("{}", result); }