use std::io::*; use std::str::FromStr; fn main() { let a: String = read(); let n = a.parse::().unwrap(); let mut result: Vec> = Vec::new(); for _ in 0..n { let a = (0..5).map(|_| read()).collect::>(); let b = vec![ i64::from_str(&a[0]).unwrap(), i64::from_str(&a[1]).unwrap(), i64::from_str(&a[2]).unwrap(), i64::from_str(&a[3]).unwrap(), if &a[4][..] == "YES" { 1 } else { 0 }, ]; result.push(b); } exec(result); } fn exec(l: Vec>) { let mut r: Vec = (0..10).collect(); for i in l { if let 1 = &i[4] { r = include(i, r); } else { r = exclude(i, r); } } println!("{:?}", r[0]); } fn include(t: Vec, r: Vec) -> Vec { let mut result: Vec = Vec::new(); for i in 0..r.len() { for _j in &t[0..4] { if &r[i] == _j { result.push(r[i]); } } } result } fn exclude(t: Vec, r: Vec) -> Vec { let mut result = r; for i in &t[0..4] { let arr: Vec = result.iter().filter(|&x| x != i).cloned().collect(); result = arr; } result } fn read() -> T { let stdin = stdin(); let stdin = stdin.lock(); let token: String = stdin .bytes() .map(|c| c.expect("failed to read char") as char) .skip_while(|c| c.is_whitespace()) .take_while(|c| !c.is_whitespace()) .collect(); token.parse().ok().expect("failed to parse token") }