結果

問題 No.3244 Range Multiple of 8 Query
ユーザー urectanc
提出日時 2025-08-22 22:35:25
言語 Rust
(1.83.0 + proconio)
結果
WA  
実行時間 -
コード長 1,829 bytes
コンパイル時間 14,172 ms
コンパイル使用メモリ 397,468 KB
実行使用メモリ 13,276 KB
最終ジャッジ日時 2025-08-22 22:36:30
合計ジャッジ時間 60,208 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
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 by_digit = vec![vec![]; 10];
    for (i, &d) in s.iter().enumerate() {
        let d = (d - b'0') as usize;
        by_digit[d].push(i);
    }

    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];
    let mut writer = std::io::BufWriter::new(std::io::stdout().lock());
    for &(l, r) in &queries {
        let mut ans = usize::MAX;

        for &(c, b, a) in &mul8 {
            right.fill(r);
            let Some(i) = find_rightmost(&by_digit[a], right[a]) else {
                continue;
            };
            if i < l {
                continue;
            }
            right[a] = i;
            let Some(j) = find_rightmost(&by_digit[b], right[b]) else {
                continue;
            };
            if j < l {
                continue;
            }
            right[b] = j;
            let Some(k) = find_rightmost(&by_digit[c], right[c]) else {
                continue;
            };
            if 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;
            ans = ans.min(cand);
        }

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

fn find_rightmost(v: &[usize], r: usize) -> Option<usize> {
    let i = v.partition_point(|&x| x < r);
    if i == 0 {
        None
    } else {
        Some(v[i - 1])
    }
}
0