use std::collections::{HashSet, hash_map};
use std::hash::Hash;
use std::io::{self, BufRead, BufWriter};
use std::io::Write;
use std::str;
use std::collections::{HashMap};
use std::cmp::{max,min};
use std::mem::{swap};
/// https://github.com/EbTech/rust-algorithms/blob/master/src/scanner.rs
pub struct Scanner<R> {
reader: R,
buffer: Vec<String>,
}
impl<R: io::BufRead> Scanner<R> {
pub fn new(reader: R) -> Self {
Self {
reader,
buffer: vec![],
}
}
pub fn token<T: str::FromStr>(&mut self) -> T {
loop {
if let Some(token) = self.buffer.pop() {
return token.parse().ok().expect("Failed parse");
}
let mut input = String::new();
self.reader.read_line(&mut input).expect("Failed read");
self.buffer = input.split_whitespace().rev().map(String::from).collect();
}
}
}
fn main() {
let mut scan = Scanner::new(io::stdin().lock());
let a = scan.token::<String>();
let b = scan.token::<String>();
let c = scan.token::<String>();
let v = a.as_bytes().iter().zip(b.as_bytes().iter()).zip(c.as_bytes().iter())
.map(|((a,b),c)| {
let a = (a-'0' as u8) as i32;
let b = (b-'0' as u8) as i32;
let c = (c-'0' as u8) as i32;
if (a+b)%10 == c {
(0,(a+b)/10)
} else if (a+b+1)%10 == c {
(1,(a+b)/10)
} else {
(2, (a+b)/10)
}
}).collect::<Vec<_>>();
let mut is_valid_mid = vec![0; a.len()];
let n = a.len();
for i in 0..n {
let carry = if i == n-1 {
1
} else {
v[i+1].1
};
if v[i].0 <= 1 && v[i].0 == carry {
is_valid_mid[i] = 1;
}
}
// eprintln!("{v:?}");
// eprintln!("{is_valid_mid:?}");
let mut cnt_valid_no_carry = 0i64;
let mut sum = 0i64;
for i in 0..n {
if v[i].0 == 0 {
// eprintln!("{i}, {}", cnt_valid_no_carry);
sum += cnt_valid_no_carry;
if v[i].1 == 0 {
sum += 1;
}
}
if is_valid_mid[i] == 1 {
if v[i].1 == 0 {
cnt_valid_no_carry += 1;
}
} else {
cnt_valid_no_carry = 0;
}
}
println!("{sum}");
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | use std::collections::{HashSet, hash_map}; use std::hash::Hash; use std::io::{self, BufRead, BufWriter}; use std::io::Write; use std::str; use std::collections::{HashMap}; use std::cmp::{max,min}; use std::mem::{swap}; /// https://github.com/EbTech/rust-algorithms/blob/master/src/scanner.rs pub struct Scanner<R> { reader: R, buffer: Vec<String>, } impl<R: io::BufRead> Scanner<R> { pub fn new(reader: R) -> Self { Self { reader, buffer: vec![], } } pub fn token<T: str::FromStr>(&mut self) -> T { loop { if let Some(token) = self.buffer.pop() { return token.parse().ok().expect("Failed parse"); } let mut input = String::new(); self.reader.read_line(&mut input).expect("Failed read"); self.buffer = input.split_whitespace().rev().map(String::from).collect(); } } } fn main() { let mut scan = Scanner::new(io::stdin().lock()); let a = scan.token::<String>(); let b = scan.token::<String>(); let c = scan.token::<String>(); let v = a.as_bytes().iter().zip(b.as_bytes().iter()).zip(c.as_bytes().iter()) .map(|((a,b),c)| { let a = (a-'0' as u8) as i32; let b = (b-'0' as u8) as i32; let c = (c-'0' as u8) as i32; if (a+b)%10 == c { (0,(a+b)/10) } else if (a+b+1)%10 == c { (1,(a+b)/10) } else { (2, (a+b)/10) } }).collect::<Vec<_>>(); let mut is_valid_mid = vec![0; a.len()]; let n = a.len(); for i in 0..n { let carry = if i == n-1 { 1 } else { v[i+1].1 }; if v[i].0 <= 1 && v[i].0 == carry { is_valid_mid[i] = 1; } } // eprintln!("{v:?}"); // eprintln!("{is_valid_mid:?}"); let mut cnt_valid_no_carry = 0i64; let mut sum = 0i64; for i in 0..n { if v[i].0 == 0 { // eprintln!("{i}, {}", cnt_valid_no_carry); sum += cnt_valid_no_carry; if v[i].1 == 0 { sum += 1; } } if is_valid_mid[i] == 1 { if v[i].1 == 0 { cnt_valid_no_carry += 1; } } else { cnt_valid_no_carry = 0; } } println!("{sum}"); } |
English