Cod sursa(job #3340243)

Utilizator petro123Alex Ionel petro123 Data 13 februarie 2026 01:55:50
Problema Potrivirea sirurilor Scor 80
Compilator rs Status done
Runda Arhiva educationala Marime 1.06 kb
use std::io::{BufWriter, Write};
use std::fs::{self, File};

fn main() -> std::io::Result<()> {
    let content = fs::read_to_string("strmatch.in")?;
    let mut writer = BufWriter::new(File::create("strmatch.out")?);
    let mut lines = content.lines();
    let a = lines.next().unwrap();
    let b = lines.next().unwrap();

    let mystring: Vec<char> = a.chars()
        .chain(std::iter::once('$'))
        .chain(b.chars())
        .collect();

    let mut pi: Vec<usize> = vec![0; mystring.len()];
    for i in 1..mystring.len() {
        let mut j = pi[i - 1];
        while j > 0 && mystring[i] != mystring[j] {
            j = pi[j - 1];
        }
        if mystring[i] == mystring[j] {
            j += 1;
        }
        pi[i] = j;
    }

    let answer: Vec<usize> = pi.iter()
        .enumerate()
        .skip(a.len() + 1)
        .filter(|&(_, v)| *v == a.len())
        .map(|(i, _)| i - 2 * a.len())
        .collect();

    writeln!(writer, "{}", answer.len())?;
    for item in answer.iter().take(1000) {
        write!(writer, "{} ", item)?;
    }
    Ok(())
}