結果

問題 No.3244 Range Multiple of 8 Query
ユーザー urectanc
提出日時 2025-08-22 23:01:53
言語 Rust
(1.83.0 + proconio)
結果
WA  
実行時間 -
コード長 1,781 bytes
コンパイル時間 12,754 ms
コンパイル使用メモリ 398,188 KB
実行使用メモリ 46,132 KB
最終ジャッジ日時 2025-08-22 23:02:24
合計ジャッジ時間 25,181 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 19 WA * 21
権限があれば一括ダウンロードができます

ソースコード

diff #

use proconio::{
    input,
    marker::{Bytes, Usize1},
};
use std::io::Write;

fn main() {
    input! {
        _n: usize, q: usize,
        s: Bytes,
        queries: [(Usize1, usize); q]
    }
    let mut writer = std::io::BufWriter::new(std::io::stdout().lock());

    let mut v = vec![!0usize; 10];
    let mut prev = vec![];
    for (i, &d) in s.iter().enumerate() {
        let d = (d - b'0') as usize;
        prev.push(v.clone());
        v[d] = i;
    }
    prev.push(v);

    let mul8 = (0..1000)
        .step_by(8)
        .map(|mut x| {
            let a = x % 10;
            x /= 10;
            let b = x % 10;
            x /= 10;
            let c = x % 10;
            (c, b, a)
        })
        .collect::<Vec<_>>();

    let mut right = [0; 10];
    for &(l, r) in &queries {
        let mut ans = usize::MAX;

        // eprintln!(
        //     "s[{l}..{r}] = {:?}",
        //     String::from_utf8(s[l..r].to_vec()).unwrap()
        // );
        for &(c, b, a) in &mul8 {
            right.fill(r);

            let i = prev[right[a]][a];
            if i == !0 || i < l {
                continue;
            }
            right[a] = i;

            let j = prev[right[b]][b];
            if j == !0 || j < l {
                continue;
            }
            right[b] = j;

            let k = prev[right[c]][c];
            if k == !0 || k < l {
                continue;
            }

            let mut cand = 3 * r - 6 - i - j - k;
            cand += (i < j) as usize + (j < k) as usize + (i < k) as usize;
            // if cand < ans {
            //     eprintln!("{c}{b}{a} at ({k}, {j}, {i}) cand = {cand}");
            // }
            ans = ans.min(cand);
        }

        writeln!(writer, "{}", ans as isize).unwrap();
    }
}
0