https://atcoder.jp/contests/abc287/tasks/abc287_d
前と後ろがどこまで合っているかを調べるだけですね。
zipが、
S.chars().zip(T.chars())
より
zip(S.chars(), T.chars())
のほうが気持ちいいのですが、これも手元ではコンパイルできたのにAtCoderではエラーが出ました。
// Match or Not #![allow(non_snake_case)] //////////////////// library //////////////////// fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } fn YesNo(b: bool) -> String { return if b { "Yes".to_string() } else { "No".to_string() } } //////////////////// process //////////////////// fn read_input() -> (String, String) { let S = read(); let T = read(); (S, T) } fn is_matched(c1: char, c2: char) -> bool { c1 == c2 || c1 == '?' || c2 == '?' } fn f(S: String, T: String) { let L1 = S.len(); let L2 = T.len(); let p1 = S.chars().zip(T.chars()).enumerate(). filter(|(_, (c1, c2))| !is_matched(*c1, *c2)). map(|(i, _)| i).next(); let p2 = S.chars().rev().zip(T.chars().rev()).enumerate(). filter(|(_, (c1, c2))| !is_matched(*c1, *c2)). map(|(i, _)| L1 - i).next(); let first = match p1 { Some(p) => p, None => L2 }; let last = match p2 { Some(p) => p, None => 0 }; for x in 0..T.len()+1 { println!("{}", YesNo(x <= first && L1-L2+x >= last)) } } fn main() { let (S, T) = read_input(); f(S, T) }