AtCoder Beginner Contest 287 D

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)
}